NutzCN Logo
问答 websocket HttpSession 为空
发布于 1939天前 作者 Rekoe 2988 次浏览 复制 上一个帖子 下一个帖子
标签:

用jetty的环境下httpSession始终为null ,同样的代码换成undertow ,httpSession就不为空,这个是需要用特殊的包,还是jetty本身就有这个问题?
nutz-boot插件都为最新

45 回复

createHandler的时候?

建立websocket之前,确定有session了?

这个在哪里断点?,但我明确是代码没边换 undertow httpsession就有了,通过这个怀疑jetty有问题的

应该是configureor类

这类中传的httpSession为null @wendal

那就是真没有咯,什么版本?建立websocket前是否已经存在session?

nboot 2.3.8-SNAPSHOT
nutz 1.r.68-SNAPSHOT

兽 你那搞个demo试试 很容易重现的

[DEBUG] 23:29:59.182 io.nutz.demo.simple.websocket.MyWsHandler.setHttpSession(MyWsHandler.java:64) - http session = WebSocketSession[websocket=JsrAnnotatedEventDriver[websocket=io.nutz.demo.simple.websocket.MyWebSocket@2482ac95],behavior=SERVER,connection=WebSocketServerConnection@454a8e5e::SocketChannelEndPoint@229498cd{/127.0.0.1:13248<->/127.0.0.1:8080,OPEN,fill=-,flush=-,to=0/300000}{io=0/0,kio=0,kro=1}->WebSocketServerConnection@454a8e5e[s=ConnectionState@4cb6d8ee[OPENING],f=org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection$Flusher@476e1b86[IDLE][queueSize=0,aggregateSize=-1,terminated=null],g=Generator[SERVER,validating,+rsv1],p=Parser@155888c9[ExtensionStack,s=START,c=0,len=0,f=null]],remote=WebSocketRemoteEndpoint@4f1dc42[batching=true],incoming=JsrAnnotatedEventDriver[websocket=io.nutz.demo.simple.websocket.MyWebSocket@2482ac95],outgoing=ExtensionStack[queueSize=0,extensions=[permessage-deflate],incoming=org.eclipse.jetty.websocket.common.extensions.compress.PerMessageDeflateExtension,outgoing=org.eclipse.jetty.websocket.common.extensions.compress.PerMessageDeflateExtension]]

并没有问题

https://github.com/nutzam/nutzboot/commit/cd788b93b510c10d1d0717cad05617cffb6efa25

打印出来, 并没有问题.

再强调一次, 一定要先有HttpSession, 然后建立WebSocket

不然websocket里面拿不到HttpSession

那可能是和vue有关系,用vue的环境下确实有这个情况,我继续跟踪下吧.

@wendal 代码跟踪到问题了
debug 到 if (session != null)
第一次刷新页面的时候 这个session是null, undertow 刷新到这个地方的时候session不是null

public class NutWsConfigurator extends ServerEndpointConfig.Configurator {

    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
        Ioc ioc = Mvcs.getIoc();
        if (ioc == null)
            ioc = Mvcs.ctx().getDefaultIoc();
        return ioc.get(endpointClass);
    }

    public void modifyHandshake(ServerEndpointConfig sec,
                                HandshakeRequest request,
                                HandshakeResponse response) {
        super.modifyHandshake(sec, request, response);
        javax.servlet.http.HttpSession session = (javax.servlet.http.HttpSession) request.getHttpSession();
        if (session != null)
            sec.getUserProperties().put("HttpSession", session);
    }
}

@wendal 兽 我跟踪的问题是jetty/undertow 处理httpSession 的两种场景下的null问题,你反应的是websocketSession 是否存在

那就是undertow有点另类咯

不是undertow 另类吧,是jetty环境下获得不了httpSession @wendal

jetty那是正确的行为,undertow能拿到是不对的

那如果这样的话 有什么方法可以把这两个sessin绑定起来么

HttpSession找Websocket的session?

Websocket 找httpSession

@wendal 不行的话 只能通过用Token的方式来找了吧

先确保有HttpSession,然后连接websocket嘛,估计你的页面js没有等页面加载完就连websocket

主页,登录,返回主页/其他页面,然后连websocket,就能保证有HttpSession啦

@wendal 兽 我是用的你上面的个demo测试的

那就是个demo嘛,刷新后,日志打印的session不为空,就是对的了

@wendal 兽 你打印的日志是WebSocket Session不是HttpSession

@wendal 兽 怎么我用最新你提交的代码httpsession 还是null 呢,你那不是null?

是一直null还是第一次访问时为null

那你的浏览器有问题

我用了那么久, httpSession也一直是空

我想说一下,我在Chrome 、火狐浏览器下试都是这个问题,开始的时候考虑 怀疑到浏览器的问题,不过两种浏览器下都有问题,但undertow下没问题,所以还是怀疑jetty有问题.
@wx_qo6sj7dp5utdpa1n0i6j 你可以试试undertow 这个是可以拿到的

jdk差异? 我打包了一个jar, 你们试一下

https://gitee.com/nutz/nutzboot/attach_files

我本地用这个jar启动, 访问页面后, 会输出这个日志

[DEBUG] 15:21:01.429 io.nutz.demo.simple.websocket.MyWsHandler.setHttpSession(MyWsHandler.java:64) - http session = Session@7a369ff0{id=node04zguz1hzlgneb47aropiy2tq0,x=node04zguz1hzlgneb47aropiy2tq0.node0,req=0,res=true}
[DEBUG] 15:21:01.444 org.nutz.plugins.mvc.websocket.handler.AbstractWsHandler.join(AbstractWsHandler.java:50) - session(id=ohhlm6v5mqi2rrltjmljb1udus) join room(name=wsroom:home)

@wendal 用你的压缩吧 是有httpSession的

java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

这个就是nutzboot里面的demo源码编译的

那问题处在jdk 版本了么? @wendal 你本地的jdk是哪个版本 我更新下再测试下

 java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

升级到这个版本问题解决了

原本的版本是?

这个是原来的版本

java -version
java version "1.8.0_144"

@wendal 发现一个问题
使用 这个会导致httpSession 为null

<dependency>
 <groupId>org.nutz</groupId>
<artifactId>nutzboot-starter-shiro</artifactId>
</dependency>

shiro代理了session,但websocket的HttpSession从web容器取,所以为null,但你说undertow下会正常?

ps: 这种锅shiro背不了的,websocket倒是有可能

问题依旧 ,还是null

添加回复
请先登陆
回到顶部