用jetty的环境下httpSession始终为null ,同样的代码换成undertow ,httpSession就不为空,这个是需要用特殊的包,还是jetty本身就有这个问题?
nutz-boot插件都为最新
@wendal 是的 兽总
[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
@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 是否存在
@wendal 不行的话 只能通过用Token的方式来找了吧
先确保有HttpSession,然后连接websocket嘛,估计你的页面js没有等页面加载完就连websocket
主页,登录,返回主页/其他页面,然后连websocket,就能保证有HttpSession啦
@wendal 兽 我是用的你上面的个demo测试的
@wendal 兽 你打印的日志是WebSocket Session不是HttpSession
@wendal 兽 怎么我用最新你提交的代码httpsession 还是null 呢,你那不是null?
@wendal 一直是null
我想说一下,我在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)
那问题处在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)
升级到这个版本问题解决了
@wendal 发现一个问题
使用 这个会导致httpSession 为null
<dependency>
<groupId>org.nutz</groupId>
<artifactId>nutzboot-starter-shiro</artifactId>
</dependency>