linux-web-console/app/src/main/java/webshell/app/terminal/TerminalWebsocketHandler.java

93 lines
2.6 KiB
Java

package webshell.app.terminal;
import java.net.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.MultiValueMap;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
import org.springframework.web.util.UriComponentsBuilder;
import io.jsonwebtoken.Jwts;
import webshell.app.AppContext;
import webshell.app.Application;
/**
* @author subhro
*
*/
public class TerminalWebsocketHandler extends AbstractWebSocketHandler {
private static final Logger logger = LoggerFactory
.getLogger(TerminalWebsocketHandler.class);
@Override
public void afterConnectionEstablished(WebSocketSession session)
throws Exception {
logger.info("Incoming session: " + session.getId() + " url: "
+ session.getUri());
synchronized (this) {
URI uri = session.getUri();
MultiValueMap<String, String> params = UriComponentsBuilder
.fromUri(uri).build().getQueryParams();
try {
String token = params.getFirst("token");
Jwts.parser().setSigningKey(Application.SECRET_KEY)
.parseClaimsJws(token);
} catch (Exception exception) {
exception.printStackTrace();
session.close(CloseStatus.BAD_DATA);
return;
}
String appId = params.getFirst("id");
PtySession app = AppContext.INSTANCES.get(appId);
if (app == null) {
logger.error("No instance for session id: " + session.getId()
+ " data: " + uri);
session.close(CloseStatus.BAD_DATA);
return;
}
app.setWs(session);
AppContext.SESSION_MAP.put(session.getId(), app);
app.start();
}
logger.info("Handshake complete session: " + session.getId() + " url: "
+ session.getUri());
}
@Override
protected void handleTextMessage(WebSocketSession session,
TextMessage message) throws Exception {
System.out.println("Message received: " + message.getPayload());
PtySession app = AppContext.SESSION_MAP.get(session.getId());
if (app == null) {
logger.error("Invalid app id: " + session.getId());
session.close(CloseStatus.BAD_DATA);
return;
}
app.sendData(message.getPayload());
}
@Override
public void afterConnectionClosed(WebSocketSession session,
CloseStatus status) throws Exception {
System.out.println("Session closed: " + session.getId());
PtySession app = AppContext.SESSION_MAP.get(session.getId());
if (app != null) {
app.close();
AppContext.SESSION_MAP.remove(session.getId());
logger.info("Session closed");
}
}
}