NutzCN Logo
问答 websocket插件 访问时报500错误
发布于 2754天前 作者 daren990 7178 次浏览 复制 上一个帖子 下一个帖子
标签:

'ws://localhost:8080/websocket' failed: Error during WebSocket handshake: Unexpected response code: 500
环境是java8,tomcat8.8.6, web-inf/libs目录下没有和tomcat 冲突的jar包;
使用了nutz-plugin-websocket的插件,
然后再pom.xml文件中引用了

但是却报了以上的错误,

    <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>
36 回复

后台没日志吗?

后台跟这个有关的报了一个,其他的没有
[DEBUG] 2017-06-08 23:02:06,348 org.nutz.mvc.impl.UrlMappingImpl.get(UrlMappingImpl.java:110) - Search mapping for [GET] path=/websocket : NOT Action match

endpoint类贴来看看

浏览器端报的错
WebSocket connection to 'ws://localhost:8080/websocket' failed: Error during WebSocket handshake: Unexpected response code: 404
处理的类只有两个一个handler,一个endpoint;

@IocBean
@ServerEndpoint(value = "/webscoket", configurator=NutWsConfigurator.class)
public class ChatServer extends AbstractWsEndpoint {
    @Inject
    Dao dao;
    public WsHandler createHandler(Session session, EndpointConfig config) {
        ChatHandler handler = new ChatHandler(roomPrefix, dao,this.sessions);
        handler.setRoomProvider(roomProvider);
        handler.setSession(session);
        return handler;
    }
}

项目部署在根路径?没有context path?

来自炫酷的 NutzCN

没有根路径,项目本身是基于nutzwk改造的,

webscoket 单词错了 websocket

// value值的单词错了
@ServerEndpoint(value = "/webscoket", configurator=NutWsConfigurator.class)

太坑了,是我写错了。。。我换过一次path,
不过更正之后,还是500的错,我再研究下;估计是jar包有关系,其他地方也不可能出错

500是抛异常

Error during WebSocket handshake: Unexpected response code: 500
浏览器看的错误,这个是在建立连接时出的错,应该是通讯层的错误,跟应用还没有关系

不是的,一般是OnOpen方法抛出异常

会不会跟拦截器有关, nutzwk的拦截器会影响它吗

debug一下NutWsConfigurator的create方法和AbstractWsEndpoint 的onOpen方法吧

自己写了个简单的websocket却能正常连接
用nutz的websocket的插件却不行


/** * */ @ServerEndpoint(value = "/websocket1") public class Testws { @OnOpen public void onOpen(Session session, EndpointConfig config) { System.out.print(1); } @OnClose public void onClose(Session session, CloseReason closeReason) { }

configurator=NutWsConfigurator.class
是这个配置导致的,具体为什么还在跟代码

@daren990 是不是iocby扫描的路径没包括这个类?

NutWsConfigurator 这个类是插件里面的类啊,不是我自定义的;

ChatServer的package是什么,主模块的iocby贴一下

chatSerrver的package :package cn.wizzer.app.websocket;
主模块的类

@Modules(scanPackage = true, packages = "cn.wizzer")
@Ok("json:full")
@Fail("http:500")
@IocBy(type = ComboIocProvider.class, args = {"*json", "config/ioc/", "*anno", "cn.wizzer", "*jedis", "*tx", "*quartz", "*async", "*rabbitmq"})
@Localization(value = "locales/", defaultLocalizationKey = "zh_CN")
@Encoding(input = "UTF-8", output = "UTF-8")
@Views({BeetlViewMaker.class, PdfViewMaker.class})
@SetupBy(value = Setup.class)
@ChainBy(args = "config/chain/nutzwk-mvc-chain.json")
@SessionBy(ShiroSessionProvider.class)
public class Module {
}

@daren990 把日志改成debug,然后贴一下

[DEBUG] 2017-06-10 11:39:50,266 org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:218) - Unable to resolve session ID from SessionKey [org.apache.shiro.web.session.mgt.WebSessionKey@70ca2d39]. Returning null to indicate a session could not be found.
[DEBUG] 2017-06-10 11:39:50,269 org.apache.shiro.web.servlet.AdviceFilter.cleanup(AdviceFilter.java:194) - Filter execution resulted in an unexpected Exception (not IOException or ServletException as the Filter API recommends). Wrapping in ServletException and propagating.
[DEBUG] 2017-06-10 11:39:53,514 org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.manage(JobStoreSupport.java:3877) - ClusterManager: Check-in complete.

不应该是这些log呢,一个websocket字样都没有

NutWsConfigurator可能报错的,只能是ioc获取bean报错了,关联一下源码就能debug了

跟ioc没有挂系,ioc都能正常的取到,

  sec.getUserProperties().put("HttpSession",request.getHttpSession());

就是这段代码的问题,如果去掉这段,或者改掉这段这样写

  sec.getUserProperties().put("HttpSession",1);

都不会报500错误,websocket都能正常连接,就是不能调用request.getHttpSession()
这个会返回一个null,这个插件还有什么限制要求没有;

像是个bug,我try-catch一下

提交修改了, 15分钟后有快照可下载

源码有问题,忘了把session放进去了

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

尴尬了... 已改

快照不是最新的啊,怎么获取啊

可能构建失败了,我看看去

搞定,deploy了

这个插件的结构是不是这样的:
AbstractWsChatEndpoint 是单例的,是websocket的入口,维护全局的信息,接管open,error,close
handler 类是多例的每个ws连接对应一个,接管onMessage 专注于信息的路由发送
provider类主要是用于缓存全局的长连接信息,以供handler类能够方便检索、路由的

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