基于SpringMVC做Websocket开发过程遇到一系列问题:
问题1:统计了一下大家遇到第一个问题就是连接websocket时候报404错误
先检查连接websocket的url格式:ws://localhost:8080/test/webSocketServer.do,这个.do后缀要匹配SpringMVC拦截后缀
其次检查下Spring配置文件是否有加这个tag:<mvc:annotation-driven/>(加这个会出现中文乱码,下面会讲到),使用Spring websocket需要这个tag支持
当Spring配置文件有使用<context:component-scan/>扫描包,这个tag<context:annotation-config/>可以不去掉。
问题2:连接websocket时候报200,说明已经进入拦截器握手成功,但是没连接上websocket
首先,这个主要原因是在自己的代码上,如果websocket有配置自己定义的拦截器,先检查下拦截器beforeHandshake这个方法,这个方法有个参数Map<String, Object> attributes,不能给这个map的value设成null,否则进不到自己Handler下的这个方法afterConnectionEstablished,就会报200其次,在自定义websocket的Handler和拦截器,加上@Component注解(这个是可选部分,根据自己环境来做选择,基本上可以拔除这个原因,仅做参考)
问题3:连接websocket时候,如果缺少配置会报415 Unsupported Media Type请求的格式不受请求页面的支持错误
当用户发送请求后,@Requestbody 注解会读取请求body中的数据,默认的请求转换器HttpMessageConverter通过获取请求头Header中的Content-Type来 确认请求头的数据格式,从而来为请求数据适配合适的转换器。例如contentType:applicatin/json,那么转换器会适配 MappingJacksonHttpMessageConverter。响应时候的时候同理,@Responsebody注解会启用 HttpMessageConverter,通过检测Header中Accept属性来适配的响应的转换器。
当在使用SpringMVC做服务器数据接收时,尤其是在做Ajax请求的时候,尤其要注意contentType属性,和accepte 属性的设置,在springmvc-config.xml中配置好相应的转换器。
添加相应转换器:
<bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter" />新增的
<ref bean="byteArrayHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter4JS" />
</list>
</property>
</bean>
可以参考这个文章:http://www.2cto.com/kf/201312/262557.html
问题4:网上例子都有说要在web.xml下的servlet和filter里面加上<async-supported>true</async-supported>我试下没有影响websocket是可以连接成功的,可以不用加,这个是用来支持异步的servlet3.x,建议不用加,除非有用到这个特性
问题5:添加<mvc:annotation-driven/>这个出现中文乱码
刚开始时候,所有浏览器都出现中文乱码,后来解决在Chrome浏览不会出现中文乱码,但是在FF下会出现。原因有三个:
第一,MessageConverter转换器没配置相应的<property name="supportedMediaTypes">属性,
第二,bean和tag的先后顺序不对,
第三,当使用<mvc:annotation-driven/>这个tag时候,请求处理器就会变成RequestMappingHandlerAdapter,跟进代码就会发现不是采用AnnotationMethodHandlerAdapter,所以配置时候要改成:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
统一解决办法是:要注意bean和tag的先后顺序
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">//这是根本原因
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter" />
<ref bean="byteArrayHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter4JS" />
</list>
</property>
</bean>
<context:component-scan base-package="扫描Spring controller包路径" />
<context:component-scan base-package="扫描websocket包路径"/>
<context:annotation-config /> //这个标注可以不加
<mvc:annotation-driven/>//这个tag一定要放在上面代码最后,这是也是乱码根源之一
这块具体的配置可以参考我上一篇文章第4点:http://strongant.iteye.com/admin/blogs/2153820
问题6:websocket相关js代码放在html上可以连接到websocket后端,放在jsp上就连接不成功
如果项目有配置yuicompressor-2.4.7.jar,就要注意了这个问题跟项目环境有关,主要是检查项目web.xml配置,项目里面web.xml配置对jsp,css,do做了自动优化(使用yuicompressor-2.4.7.jar),自动优化会把jsp输出优化成无格式,主要用于传输速度变快,但是变成无格式后websocket相关脚本就出现运行不了,最后把这块jsp自动优化去掉
问题7:js上onopen和onmessage会同时触发
当第一次连接到websocket后台,会触发Handler下的afterConnectionEstablished这个方法发送消息,如果在这个方法有发送消息给自己,在UI上会同时触发onopen和onmessage方法,这个不知道为什么会触发onmessage方法,从websocket上协议讲,只会触发onopen方法!!!
问题8:返回jsp时候,路径出现重复名字导致找不到jsp页面(这个大家估计不会遇到,跟项目配置有关)
比如:正常要返回路径localhost:8080/test/template/js/list.jsp
变成错误路径:localhost:8080/test/template/template/js/list.jsp(多了一个template),后来发现是我的视图解释图配置有点问题
<bean id="viewResolvers"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".jsp" />
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="contentType">
<value>text/html; charset=UTF-8</value>
</property>
</bean>
改成下面这个配置解决这个问题
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
问题9:启动时候出现这个Factory method 'webSocketHandlerMapping' threw exception; nested exception is java.lang.IllegalStateException: No suitable default RequestUpgradeStrategy found
说明你的容器不支持websocket协议Tomcat7,0.26之后才支持websocket
Jboss as 7不支持websocket,需要要安装插件,可以直接升级到wildfly8支持websocket
分享到:
相关推荐
本文将详细解析"spring4.0.6+mybatis3.2.7整合包"的整合过程及其相关知识点。 首先,Spring 4.0.6是Spring框架的一个稳定版本,它提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,使得开发者能够更好地管理...
自己参考了官方的Spring4集成WebSocket的Demo。编写的一个Spring4集成WebSocket的例子(no-maven).环境Eclipse(indigo)+jdk7+tomcat7+Spring4.0.6+SpringMVC. 希望对初次接触WebSocket的同学有所帮助。
4. **WebSocket支持**:为了适应实时通信的需求,Spring 4.0.6.RELEASE集成了WebSocket API,允许开发者创建基于WebSocket的应用,实现双向通信。 5. **反应式编程**:Spring 4.0.6.RELEASE开始引入对反应式编程的...
4.0.6.RELEASE 版本是 Spring 的一个重要里程碑,它在之前版本的基础上进行了多方面的改进和增强,为开发者带来了更稳定、更高效的功能。 Spring 框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切...
本篇文章将详细探讨Spring Framework 4.0.6.RELEASE版本的源码,帮助开发者更好地理解和运用这一版本的核心功能。 1. **模块架构** Spring Framework 4.0.6由多个模块组成,包括Core Container(核心容器)、Data ...
websocket jar包,spring-messaging-4.0.6.RELEASE,spring-websocket-4.0.6.RELEASE,tomcat7-websocket,websocket-api
在 Spring MVC 4.0.6 版本中,我们能看到一系列增强特性和优化,使其成为企业级应用开发的首选工具之一。 首先,让我们深入理解 Spring MVC 的核心概念: 1. **DispatcherServlet**:作为 Spring MVC 应用的前端...
本文将详细介绍如何利用Spring 4.0.6及以上版本和WebSocket技术来构建一个消息推送系统。\n\n首先,我们需要了解WebSocket的基本概念。WebSocket是一种在客户端和服务器之间建立长连接的协议,允许双方进行全双工...
以下是对Spring Framework 4.1.6.RELEASE的一些关键知识点的详细说明: 1. **依赖管理**: Spring 4.1.6.RELEASE包含了一套完整的依赖管理系统,它规定了与其他库(如Hibernate、MyBatis等)集成时的最佳版本,...
Spring 4.0.6引入了大量的注解,如@Service、@Repository、@Controller等,使得开发者能更加方便地进行无XML配置的开发。 7. **性能优化** 在这个版本中,Spring对性能进行了优化,包括更快的启动时间、更高效的...
4.0.6 VERSION: GLIBC : 2.29 特性 通过SpringBoot提供 Restful API 使用Java线程池技术,支持并发推流 使用,相比直接调用ffmpeg命令行,更加灵活,支持更多的定制。 容器化部署,简化部署流程 使用 1. 容器部署 ...