Created
May 18, 2016 07:46
-
-
Save Dreampie/9d0392540566045a2488de4b4cf1ae08 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Implement the HandshakeInter as below. | |
```java | |
public class HttpSessionIdHandshakeInterceptor implements HandshakeInterceptor { | |
public boolean beforeHandshake(ServerHttpRequest request, | |
ServerHttpResponse response, | |
WebSocketHandler wsHandler, | |
Map<String, Object> attributes) | |
throws Exception { | |
if (request instanceof ServletServerHttpRequest) { | |
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; | |
HttpSession session = servletRequest.getServletRequest().getSession(false); | |
if (session != null) { | |
attributes.put(SESSION_ATTR, session.getId()); | |
} | |
} | |
return true; | |
} | |
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, | |
WebSocketHandler wsHandler, Exception ex) { | |
} | |
} | |
``` | |
Then Add to the endpoint. | |
```java | |
public class WebSocketConfig extends | |
AbstractWebSocketMessageBrokerConfigurer { | |
public void registerStompEndpoints(StompEndpointRegistry registry) { | |
registry.addEndpoint("/portfolio") | |
.withSockJS() | |
.setInterceptors(new HttpSessionIdHandshakeInterceptor()); | |
} | |
... | |
} | |
``` | |
Next we can create a ChannelInterceptorAdapter that uses the session id to update the last accessed time using Spring Session. For example: | |
```java | |
@Bean public ChannelInterceptorAdapter sessionContextChannelInterceptorAdapter() { | |
return new ChannelInterceptorAdapter() { | |
@Override | |
public Message<?> preSend(Message<?> message, MessageChannel channel) { | |
Map<String, Object> sessionHeaders = SimpMessageHeaderAccessor.getSessionAttributes(message.getHeaders()); | |
String sessionId = (String) sessionHeaders.get(SESSION_ATTR); | |
if (sessionId != null) { | |
Session session = sessionRepository.getSession(sessionId); | |
if (session != null) { | |
sessionRepository.save(session); | |
} | |
} | |
return super.preSend(message, channel); | |
} | |
}; | |
} | |
``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment