首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websocket - httpSession返回null

Websocket - httpSession返回null
EN

Stack Overflow用户
提问于 2013-11-27 18:58:43
回答 3查看 7.8K关注 0票数 15

我想在websocket握手\会话与HttpSession对象之间建立连接。

我使用了以下握手修改:

代码语言:javascript
复制
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator
{
@Override
public void modifyHandshake(ServerEndpointConfig config, 
                            HandshakeRequest request, 
                            HandshakeResponse response)
{
    HttpSession httpSession = (HttpSession)request.getHttpSession();
    config.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
}

正如这篇文章中提到的:Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint

现在,由于握手时的某些原因,(HttpSession)request.getHttpSession()总是返回null。

这是我的客户端代码:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
<title>Testing websockets</title>
</head>
<body>
<div>
    <input type="submit" value="Start" onclick="start()" />
</div>
<div id="messages"></div>
<script type="text/javascript">
    var webSocket = 
        new WebSocket('ws://localhost:8080/com-byteslounge-websockets/websocket');

    webSocket.onerror = function(event) {
        onError(event)
    };

    webSocket.onopen = function(event) {
        onOpen(event)
    };

    webSocket.onmessage = function(event) {
        onMessage(event)
    };

    function onMessage(event) {
        document.getElementById('messages').innerHTML 
            += '<br />' + event.data;
    }

    function onOpen(event) {
        document.getElementById('messages').innerHTML 
            = 'Connection established';
    }

    function onError(event) {
        alert(event.data);
    }

    function start() {
        webSocket.send('hello');
        return false;
    }
</script>
</body>
</html>

你知道为什么没有创建会话吗?谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-12-17 04:35:13

这是Pavel Bucek答案的impl,添加后,我得到了会话

代码语言:javascript
复制
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener
public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub

    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ((HttpServletRequest) sre.getServletRequest()).getSession();
    }

}
票数 9
EN

Stack Overflow用户

发布于 2017-07-14 05:44:59

@pavel-bucek 's answer的基础上,我写了一个simple HttpSessionInitializerFilter servlet filter

只需从"Releases“页面下载jar并将其保存在类路径中的任何位置,然后将以下代码片段添加到您的模式描述符中(根据需要修改web.xml -pattern):

代码语言:javascript
复制
<filter>
  <filter-name>HttpSessionInitializerFilter</filter-name>
  <filter-class>net.twentyonesolutions.servlet.filter.HttpSessionInitializerFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>HttpSessionInitializerFilter</filter-name>
  <url-pattern>/ws/*</url-pattern>
</filter-mapping>
票数 1
EN

Stack Overflow用户

发布于 2017-08-25 11:17:16

首先:创建一个新类

代码语言:javascript
复制
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener

public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        ((HttpServletRequest)servletRequestEvent.getServletRequest()).getSession();
    }
}

然后在App main上添加"ServletComponentScan“注释:

代码语言:javascript
复制
@SpringBootApplication

@ServletComponentScan

public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20240591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档