Spring 4 WebSockets + SockJS - websocket:握手 - 拦截器永远不会被调用

时间:2014-04-09 12:19:44

标签: spring websocket sockjs

我正在测试Spring 4的不同WebSocket方法。

最基本的,运行良好,调用拦截器(我想发布HttpSession属性):

<websocket:handlers>
    <websocket:mapping path="/simpleChatHandler" handler="simpleChatHandler"/>
    <websocket:handshake-interceptors>
        <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
    </websocket:handshake-interceptors>
</websocket:handlers>

这是在org.springframework.web.socket.server.support.WebSocketHttpRequestHandler.handleRequest()

中调用拦截器的时间
[...]
try {
    Map<String, Object> attributes = new HashMap<String, Object>();
    if (!chain.applyBeforeHandshake(request, response, attributes)) {

但是当我使用SockJS处理程序时,永远不会调用拦截器:

<websocket:handlers>
    <websocket:mapping path="/simpleChatHandlerSockJS" handler="simpleChatHandler"/>
    <websocket:handshake-interceptors>
        <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor"/>
    </websocket:handshake-interceptors>
    <websocket:sockjs/>
</websocket:handlers>

org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler不同,WebSocketHttpRequestHandler似乎没有“拦截器”属性。

这是一个Spring bug吗?你知道如何将HttpSessionAttributes发布到SockJS websockets吗?

1 个答案:

答案 0 :(得分:2)

编辑:2014年4月28日:

好的,我一直在做的是通过Java配置Websockets,因为我发现它更灵活:

尝试将此代码作为Java配置的一部分:

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  registry.addHandler(new Handler(), "/endpoint")
    .addInterceptors(new HttpSessionHandshakeInterceptors())
  .withSockJS();
}

我正在使用此代码,它正在为我工​​作。您需要参考spring-websocket文档以获取完整的代码。

干杯