Struts2 Spring 整合WebSocket 问题

s09122289 2016-06-15 05:59:29
web.xml头部
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

所有filter增加了<async-supported>true</async-supported>

struts.xml增加了过滤ws
<constant name="struts.action.excludePattern" value="^ws://.+$,/ws/.*"></constant>


spring.xml部分
<context:component-scan base-package="com.xxx"/>


WebSocketConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

import com.clps.tmp.core.common.websocket.handle.SystemWebSocketHandler;
import com.clps.tmp.core.common.websocket.interceptor.HandshakeInterceptor;


@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {

public WebSocketConfig() {
}

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
/*注册websocket server实现类,第二个参数是访问websocket的地址*/
registry.addHandler(systemWebSocketHandler(), "/ws").addInterceptors(new HandshakeInterceptor());
/*使用Sockjs的注册方法*/
registry.addHandler(systemWebSocketHandler(), "/sockjs/ws").addInterceptors(new HandshakeInterceptor()).withSockJS();
System.out.println("************WebSocket Registed*******************");
}

@Bean
public WebSocketHandler systemWebSocketHandler() {
return new SystemWebSocketHandler();
}
}


SystemWebSocketHandler
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
@Component
public class SystemWebSocketHandler implements WebSocketHandler {

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("connect to the websocket success......");
session.sendMessage(new TextMessage("Server:connected OK!"));
}

@Override
public void handleMessage(WebSocketSession wss, WebSocketMessage<?> wsm) throws Exception {
TextMessage returnMessage = new TextMessage(wsm.getPayload()
+ " received at server");
System.out.println(wss.getHandshakeHeaders().getFirst("Cookie"));
wss.sendMessage(returnMessage);
}

@Override
public void handleTransportError(WebSocketSession wss, Throwable thrwbl) throws Exception {
if(wss.isOpen()){
wss.close();
}
System.out.println("websocket connection closed......");
}

@Override
public void afterConnectionClosed(WebSocketSession wss, CloseStatus cs) throws Exception {
System.out.println("websocket connection closed......");
}

@Override
public boolean supportsPartialMessages() {
return false;
}

}


HandshakeInterceptor
import java.util.Map;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
@Component
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {

@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {

//解决The extension [x-webkit-deflate-frame] is not supported问题
if(request.getHeaders().containsKey("Sec-WebSocket-Extensions")) {
request.getHeaders().set("Sec-WebSocket-Extensions", "permessage-deflate");
}
//return true;

System.out.println("Before Handshake");
return super.beforeHandshake(request, response, wsHandler, attributes);
}

@Override
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
System.out.println("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}

}


页面部分:
<script src="${pageContext.request.contextPath}/common/js/sockjs-0.3.min.js"></script>
<script type="text/javascript">
var ws = null;
var url = null;
var transports = [];

if ('WebSocket' in window) {
ws= new WebSocket("ws://localhost:8080/TMP/ws");
console.info("ws://localhost:8080/TMP/ws");
}else {
ws = new SockJS("http://localhost:8080/TMP/sockjs/ws");
console.info("http://localhost:8080/TMP/sockjs/ws");
}
ws.onopen = function() {
alert('open');
console.info('open');
};
ws.onmessage = function(event) {
alert('Received:' + event.data);
console.info('Received:' + event.data);
};
ws.onclose = function(event) {
alert('Info: connection closed.');
console.info(event);
};
</script>


代码是参考网上的。目前项目启动时,websocket的服务能注册,但是页面请求建立websocket连接时,后端没接收到任何消息,过滤器/websocket的拦截器,处理器都没有收到,页面也直接alert出 connection closed。各位大神,有没有相关经验的,指点下呗
...全文
709 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌霄•橙 2017-10-20
  • 打赏
  • 举报
回复
这个问题最后怎么解决的,遇到了同样的问题
qq_34761743 2016-12-15
  • 打赏
  • 举报
回复
各位是怎么解决的
阳光小巫 2016-11-08
  • 打赏
  • 举报
回复
楼主怎么解决的
蛋蛋の忧伤 2016-09-23
  • 打赏
  • 举报
回复
操蛋了,哥们我也遇到这个问题了!
wahahachuang5 2016-08-08
  • 打赏
  • 举报
回复
如果想从服务器端推送消息到客户端的话,个人觉得GoEasy推送还不错,它有Restful API 支持多语言,而且针对java他们还特别做了SDK,使用很简单方便。同时它也支持客户端推送。由于它支持websocket 和polling两种连接方式所以兼顾大多数主流浏览器,低版本的IE浏览器也是支持的,很适合需要快速建立实时web通信的项目。https://goeasy.io

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧