diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandler.java index 746e593c4cf4..a3ad41cf849d 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandler.java @@ -60,10 +60,11 @@ public interface TransportHandler { * @param response the current response * @param handler the target WebSocketHandler (never {@code null}) * @param session the SockJS session (never {@code null}) + * @return whether the given session is still valid * @throws SockJsException raised when request processing fails as * explained in {@link SockJsService} */ - void handleRequest(ServerHttpRequest request, ServerHttpResponse response, + boolean handleRequest(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, SockJsSession session) throws SockJsException; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java index 40a19881077c..0decb05b1edd 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java @@ -310,7 +310,9 @@ else if (transportType.supportsCors()) { return; } - transportHandler.handleRequest(request, response, handler, session); + if (!transportHandler.handleRequest(request, response, handler, session)) { + sessions.remove(sessionId); + } chain.applyAfterHandshake(request, response, null); } catch (SockJsException ex) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpReceivingTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpReceivingTransportHandler.java index 1e3e933dac86..db64e164d726 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpReceivingTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpReceivingTransportHandler.java @@ -45,13 +45,14 @@ public boolean checkSessionType(SockJsSession session) { } @Override - public final void handleRequest(ServerHttpRequest request, ServerHttpResponse response, + public final boolean handleRequest(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, SockJsSession wsSession) throws SockJsException { Assert.notNull(wsSession, "No session"); AbstractHttpSockJsSession sockJsSession = (AbstractHttpSockJsSession) wsSession; handleRequestInternal(request, response, wsHandler, sockJsSession); + return true; } protected void handleRequestInternal(ServerHttpRequest request, ServerHttpResponse response, diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java index ef566c7f8db1..8c4c33bf733a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java @@ -52,7 +52,7 @@ public abstract class AbstractHttpSendingTransportHandler extends AbstractTransp @Override - public final void handleRequest(ServerHttpRequest request, ServerHttpResponse response, + public final boolean handleRequest(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, SockJsSession wsSession) throws SockJsException { AbstractHttpSockJsSession sockJsSession = (AbstractHttpSockJsSession) wsSession; @@ -64,6 +64,7 @@ public final void handleRequest(ServerHttpRequest request, ServerHttpResponse re response.getHeaders().setContentType(getContentType()); handleRequestInternal(request, response, sockJsSession); + return true; } protected void handleRequestInternal(ServerHttpRequest request, ServerHttpResponse response, diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/WebSocketTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/WebSocketTransportHandler.java index 77e7bbe2f0c9..763158a522b8 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/WebSocketTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/WebSocketTransportHandler.java @@ -116,13 +116,13 @@ public AbstractSockJsSession createSession(String id, WebSocketHandler handler, } @Override - public void handleRequest(ServerHttpRequest request, ServerHttpResponse response, + public boolean handleRequest(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, SockJsSession wsSession) throws SockJsException { WebSocketServerSockJsSession sockJsSession = (WebSocketServerSockJsSession) wsSession; try { wsHandler = new SockJsWebSocketHandler(getServiceConfig(), wsHandler, sockJsSession); - this.handshakeHandler.doHandshake(request, response, wsHandler, sockJsSession.getAttributes()); + return this.handshakeHandler.doHandshake(request, response, wsHandler, sockJsSession.getAttributes()); } catch (Exception ex) { sockJsSession.tryCloseWithSockJsTransportError(ex, CloseStatus.SERVER_ERROR);