Spring4.0.6 Websocket详细配置 之 遇到问题

基于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

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值