1、场景

在用websocket做一个简单的数据导入页面同步显示后台进度功能的时候,浏览器出现连接不上的错误:

WebSocket connection to 'ws://localhost:8080/project/marco' failed: Error during WebSocket handshake: Unexpected response code: 404

网上有很种导致404的情况,但是都没有用,我在这里记录一下我的情况。

2、解决过程

spring-websocket.xml的配置:

<websocket:handlers>
<websocket:mapping handler="messageHandler" path="/marco" />
<websocket:handshake-interceptors>
<bean class="com.project.websocket.HandshakeInterceptor"/>
</websocket:handshake-interceptors>
</websocket:handlers> <bean id="messageHandler" class="com.project.websocket.MessageHandler"/>

查看打印的INFO级别日志,根据spring的启动信息我们可以看到:

2017-02-09 21:57:40,559 INFO  [springframework.web.servlet.handler.SimpleUrlHandlerMapping] - Mapped URL path [/marco] onto handler of type [class org.springframework.web.socket.server.support.WebSocketHttpRequestHandler]

WebSocketHttpRequestHandler通过SimpleUrlHandlerMapping注册了/marco地址,那应该是没错的啊,难道是客户端js的错误?

var websocket = new WebSocket('ws://' + window.location.host + '/project/marco');

地址好像也没错啊,和Spring in Action4里面的例子一样的啊。

为什么地址没有映射到/marco?先看看DispatchServlet的handlerMappings有没有/marco先吧。

断点DispatchServlet的doDispatch()方法,随便发起一个请求:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
......
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
......
}

进入getHandler(processedRequest)

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}

我们看一下handlerMappings里面的内容,不知道你们有没有找到/marco,反正我是没找到。

言下之意,/marco没注册到?

没办法,我们断点SimpleUrlHandlerMapping的registerHandlers()方法和DispatchServlet的initHandlerMappings()方法。

我们看到SimpleUrlHandlerMapping的registerHandlers()先被执行。

最后退出registerHandlers()方法,F6一路下来,从WebApplicationObjectSupport的initApplicationContext()方法中可以看到:

  • context.beanFactory.beanDefintionMap中包含[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0->RootBeanDefintion]
  • 而且context.beanFactory.singletonObjects也包含了注册了/marco的SimpleUrlHandlerMapping实例。
  • 此时的context.configLocations是classpath:spring-context.xml

DispatchServlet的initHandlerMappings()后被执行,我们来看这段:

// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
Map<String, HandlerMapping> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);

然而,在matchingBeans没有找到我们要的注册了/marco的SimpleUrlHandlerMapping。此时的context.configLocations是classpath*:spring-servlet.xml

来到这里,你大概知道就是你的spring-websocket.xml放错位置啦。

3、解决办法

如果你的web.xml分开加载spring-context和spring-servlet的话,请将spring-websocket的资源文件放到spring-servlet上加载。

注意:在spring-context加载的时候,你的messageHandler应该是还没有初始化,请不要注入到某个service上。

Spring websocket浏览器连接时出现404错误的更多相关文章

  1. IIS7或者IIS7.5部署MVC项目时出现404错误

    IIS7或者IIS7.5部署MVC项目时出现404错误 服务器上需要安装Windows 补丁 kb980368  下载链接:http://support.microsoft.com/kb/980368

  2. 前端lvs访问多台nginx代理服务时出现404错误的处理

    前端lvs访问多台nginx代理服务时出现404错误的处理 环境描述:app --> lvs --> nginx --> server app访问页面购买流量页面(nginx服务器) ...

  3. elipse中开发servlet,直接run as 时出现404错误的解决方法

    在elipse中开发servlet时,无论在IDE中运行,还是在浏览器中访问servlet时,一直报404错误, 后发现在build目录中没有生成相应的类文件,后反复采用project中的clean. ...

  4. Spring Initializr生成的demo测试404错误

    体验Spring Initializr生成的spring boot工程,启动成功, 目录结构如下: 添加了一个简单的controller后,启动成功但访问报404错误: 原因: springboot默 ...

  5. jmeter做bbs作业时提示404错误

    在用jemter做bbs作业时候,注册成功后会跳转到主页,在写主页的脚本的时候,将fiddler抓到的url复制到路径下方“/bbs/forum.php”,但是第一次复制的时候在/bbs/forum. ...

  6. uploadify上传大文件时出现404错误

    出现这个错误的话一般是IIs限制了文件大小.IIS7下的默认设置限制了上传大小.这个时候Web.Config中的大小设置也就失效了.具体步骤:1.打开IIS管理器,找到Default Web Site ...

  7. spring boot的maven项目报404错误

    $.ajax({ async: false, type: "POST", url:'searchFileSource', contentType : "applicati ...

  8. IIS6下, web.config配置为targetFramework="4.0"时出404错误

    打开IIS管理器,在"Web 服务扩展" 中 将ASP.NET v4.0设置为允许就好了.这个选项默认是禁止的.

  9. debian7安装了mysql后,局域网去连接时出现10061错误

随机推荐

  1. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  2. pip使用国内镜像源

    windows版 1.在windows文件管理器中,输入 %APPDATA% 2.在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件 3.在新建的pip.ini文件中输入以下 ...

  3. 第208天:jQuery框架封装(一)

    一.事件框架 1.DOM2 --事件流 事件流 :冒泡 捕获 1.1冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象或者body)的顺序触发. 1.1.1浏览器兼容问题处理 ...

  4. 第79天:jQuery事件总结(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 一.合成事件 jQuery有两个合成事件——hove ...

  5. 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp

    题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...

  6. C++ Win系统下的调试

    有的时候我们找不出错误在哪里,这时候我们需要调试一遍看看到底是哪里出了问题:我们需要分布查看程序运行情况. 这时候我们用到了调试这样一个神奇的东西. 一.基于Dev cpp环境下的调试 Dev cpp ...

  7. Day22-session

    1. cookie: 保存在用户浏览器端的一个键值对.基于cookie做用户验证的时候,不适合把敏感信息放到cookie中.例如我们可以把user_id这个不敏感的信息放到cookie中,然后基于us ...

  8. NOIP2017 Day2 T2 宝藏(状压DP)

    $O(n*3^n)$好难想...还有好多没见过的操作 令$f[i][j]$表示最深深度为i,点的状态为j的最小代价,每次枚举状态$S$后,计算$S$的补集里的每个点与S里的点的最小连边代价,再$O(3 ...

  9. 【arc080F】Prime Flip

    Portal --> arc080_f Solution ​  这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) ​​  (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...

  10. oracle中建立job(任务)

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...