求助各位大神,现在我的WebSocket是这么配置的:
注册类:/**
* WebSocket注册类
*
* @author zhangdanji
*
*/
@Configuration
@EnableWebMvc
@EnableWebSocket
public class DataPresentationWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer
{
private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketConfig.class);
/**
* 注册WebSocketHandler
*
* @author zhangdanji
* @param registry
*
*/
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
{
logger.info("---Begin Invoke:DataPresentationWebSocketConfig.registerWebSocketHandlers---");
registry.addHandler(dataPresentationWebSocketHandler(), "/dataPresentationWebSocketServer.do").addInterceptors(new DataPresentationWebSocketInterceptor());
}
@Bean
public WebSocketHandler dataPresentationWebSocketHandler(){
return new DataPresentationWebSocketHandler();
}
}
handler:/**
* WebSocketHandler类
*
* @author zhangdanji
*
*/
public class DataPresentationWebSocketHandler extends TextWebSocketHandler
{ private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketHandler.class);
public static final List<WebSocketSession> LOGIN_USERS = Collections.synchronizedList(new ArrayList<WebSocketSession>());
@Autowired
private DataPresentationService dataPresentationService;
/**
* WebSocket连接创建
*
* @author zhangdanji
* @param session
*
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.afterConnectionEstablished---");
LOGIN_USERS.add(session); //将登录的WebSocketSession放入缓存中
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket连接已建立---");
} /**
* WebSocket接受消息并发送
*
* @author zhangdanji
* @param session
* message
*
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.handleTextMessage{message:" + message.getPayload() + "}---");
//根据页面消息设置工作标识
if("WEBSOCKET_IS_WORK".equals(message.getPayload())){
//WebSocket启动工作
WebSocketUtil.setWebSocketWorkFlag(session, true);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket开始工作---");
}else if("WEBSOCKET_STOP_WORK".equals(message.getPayload())){
//WebSocket停止工作
WebSocketUtil.setWebSocketWorkFlag(session, false);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket停止工作---");
}else if(message.getPayload().startsWith("WEBSOCKET_BIND_USER")){
//绑定WebSocketSession用户
String bindUserId = message.getPayload().substring(message.getPayload().indexOf(":") + 1);
if(StringUtils.isEmpty(bindUserId) || !StringUtils.isInteger(bindUserId)){
throw new RuntimeException("绑定的用户ID不存在或不是整数类型");
}
WebSocketUtil.setWebSocketBindUser(session, Integer.parseInt(bindUserId));
}else if(message.getPayload().startsWith("WEBSOCKET_REFRESH_ALL_DATA")){
//刷新所有数据
String updateUserId = message.getPayload().substring(message.getPayload().indexOf(":") + 1);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "刷新用户" + updateUserId + "所有数据---");
if(StringUtils.isEmpty(updateUserId) || !StringUtils.isInteger(updateUserId)){
throw new RuntimeException("更新数据的用户ID不存在或不是整数类型");
}
SysUser updateUser = new SysUser(Integer.parseInt(updateUserId));
dataPresentationService.updateDataPresentation(updateUser, 0);
}else{
//WebSocket设置是否启用标识,若启用则发送消息
Boolean isWork = WebSocketUtil.getWebSocketWorkFlag(session);
if(isWork){
session.sendMessage(new TextMessage(message.getPayload()));
}else{
logger.info("---INFO:用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket未启用工作---");
}
}
} /**
* WebSocket处理异常
*
* @author zhangdanji
* @param session
* exception
*
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.handleTransportError{exception:" + exception.getMessage() + "}---");
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket因异常关闭---");
if(session.isOpen()){
session.close();
}
LOGIN_USERS.remove(session);
} /**
* WebSocket关闭连接
*
* @author zhangdanji
* @param session
* closeStatus
*
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.afterConnectionClosed{closeStatus:" + closeStatus + "}---");
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket关闭---");
LOGIN_USERS.remove(session);
} /**
* WebSocket局部消息
*
* @author zhangdanji
*
*/
@Override
public boolean supportsPartialMessages()
{
return false;
}}interceptor:/**
* WebSocket拦截器
*
* @author zhangdanji
*
*/
public class DataPresentationWebSocketInterceptor extends HttpSessionHandshakeInterceptor
{
private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketInterceptor.class); @Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketInterceptor.beforeHandshake---");
if (request instanceof ServletServerHttpRequest) {
//从request中获取user信息放入WebSocketSession中
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpServletRequest req = servletRequest.getServletRequest();
SysUser user = UserUtil.getUser(req);
attributes.put("LOGIN_USER", user);
}
return super.beforeHandshake(request, response, wsHandler, attributes);
}
}js:// WebSocket对象
var url = crmUrl.replace("http://","ws://") + "/dataPresentationWebSocketServer.do";
var _webSocket = {
socket : null, // WebSocket连接对象
host : '', // WebSocket连接 url
connect : function() { // 连接服务器
window.WebSocket = window.WebSocket || window.MozWebSocket;
if (!window.WebSocket) { // 检测浏览器支持
top.showMsg("", "当前浏览器不支持WebSocket,无法更新数据", true, "warning");
return;
}
this.socket = new WebSocket(this.host); // 创建连接并注册响应函数
this.socket.onopen = onOpenCallBack;
this.socket.onmessage = onMessageCallBack;
this.socket.onclose = function(){
_webSocket.socket = null; // 清理
};
},
send : function(message) { // 发送消息方法
if (this.socket) {
this.socket.send(message);
return true;
}
top.showMsg("", "WebSocket未连接!", true, "warning");
return false;
}
};
// 初始化WebSocket连接 url
_webSocket.host = url; if(!_webSocket.socket){
//建立WebSocket连接
_webSocket.connect();
}
以上是代码,我在本机和sit环境测试的都没有问题,但是转测得时候由于域名格式不一样就有WebSocket connection to 'ws://crm.to3.mychebao.com/dataPresentationWebSocketServer.do' failed: Error during WebSocket handshake: Unexpected response code: 400这个问题
本机WebSocket地址是http://127.0.0.1:8080/crm-web/dataPresentationWebSocketServer.do
sit环境地址是http://boss.sit2.mychebao.com:8080/crm-web/dataPresentationWebSocketServer.do
转测之后地址是http://boss.to3.mychebao.com/dataPresentationWebSocketServer.do
转测之后的环境是把端口号、项目名全部集成在一个域名下,这个环境就会报这个错,求大神帮忙看一下!!
注册类:/**
* WebSocket注册类
*
* @author zhangdanji
*
*/
@Configuration
@EnableWebMvc
@EnableWebSocket
public class DataPresentationWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer
{
private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketConfig.class);
/**
* 注册WebSocketHandler
*
* @author zhangdanji
* @param registry
*
*/
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
{
logger.info("---Begin Invoke:DataPresentationWebSocketConfig.registerWebSocketHandlers---");
registry.addHandler(dataPresentationWebSocketHandler(), "/dataPresentationWebSocketServer.do").addInterceptors(new DataPresentationWebSocketInterceptor());
}
@Bean
public WebSocketHandler dataPresentationWebSocketHandler(){
return new DataPresentationWebSocketHandler();
}
}
handler:/**
* WebSocketHandler类
*
* @author zhangdanji
*
*/
public class DataPresentationWebSocketHandler extends TextWebSocketHandler
{ private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketHandler.class);
public static final List<WebSocketSession> LOGIN_USERS = Collections.synchronizedList(new ArrayList<WebSocketSession>());
@Autowired
private DataPresentationService dataPresentationService;
/**
* WebSocket连接创建
*
* @author zhangdanji
* @param session
*
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.afterConnectionEstablished---");
LOGIN_USERS.add(session); //将登录的WebSocketSession放入缓存中
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket连接已建立---");
} /**
* WebSocket接受消息并发送
*
* @author zhangdanji
* @param session
* message
*
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.handleTextMessage{message:" + message.getPayload() + "}---");
//根据页面消息设置工作标识
if("WEBSOCKET_IS_WORK".equals(message.getPayload())){
//WebSocket启动工作
WebSocketUtil.setWebSocketWorkFlag(session, true);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket开始工作---");
}else if("WEBSOCKET_STOP_WORK".equals(message.getPayload())){
//WebSocket停止工作
WebSocketUtil.setWebSocketWorkFlag(session, false);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket停止工作---");
}else if(message.getPayload().startsWith("WEBSOCKET_BIND_USER")){
//绑定WebSocketSession用户
String bindUserId = message.getPayload().substring(message.getPayload().indexOf(":") + 1);
if(StringUtils.isEmpty(bindUserId) || !StringUtils.isInteger(bindUserId)){
throw new RuntimeException("绑定的用户ID不存在或不是整数类型");
}
WebSocketUtil.setWebSocketBindUser(session, Integer.parseInt(bindUserId));
}else if(message.getPayload().startsWith("WEBSOCKET_REFRESH_ALL_DATA")){
//刷新所有数据
String updateUserId = message.getPayload().substring(message.getPayload().indexOf(":") + 1);
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "刷新用户" + updateUserId + "所有数据---");
if(StringUtils.isEmpty(updateUserId) || !StringUtils.isInteger(updateUserId)){
throw new RuntimeException("更新数据的用户ID不存在或不是整数类型");
}
SysUser updateUser = new SysUser(Integer.parseInt(updateUserId));
dataPresentationService.updateDataPresentation(updateUser, 0);
}else{
//WebSocket设置是否启用标识,若启用则发送消息
Boolean isWork = WebSocketUtil.getWebSocketWorkFlag(session);
if(isWork){
session.sendMessage(new TextMessage(message.getPayload()));
}else{
logger.info("---INFO:用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket未启用工作---");
}
}
} /**
* WebSocket处理异常
*
* @author zhangdanji
* @param session
* exception
*
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.handleTransportError{exception:" + exception.getMessage() + "}---");
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket因异常关闭---");
if(session.isOpen()){
session.close();
}
LOGIN_USERS.remove(session);
} /**
* WebSocket关闭连接
*
* @author zhangdanji
* @param session
* closeStatus
*
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketHandler.afterConnectionClosed{closeStatus:" + closeStatus + "}---");
logger.info("---用户" + WebSocketUtil.getSysUserFromWebSocketSession(session).getName() + "WebSocket关闭---");
LOGIN_USERS.remove(session);
} /**
* WebSocket局部消息
*
* @author zhangdanji
*
*/
@Override
public boolean supportsPartialMessages()
{
return false;
}}interceptor:/**
* WebSocket拦截器
*
* @author zhangdanji
*
*/
public class DataPresentationWebSocketInterceptor extends HttpSessionHandshakeInterceptor
{
private Logger logger = LoggerFactory.getLogger(DataPresentationWebSocketInterceptor.class); @Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception
{
logger.info("---Begin Invoke:DataPresentationWebSocketInterceptor.beforeHandshake---");
if (request instanceof ServletServerHttpRequest) {
//从request中获取user信息放入WebSocketSession中
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpServletRequest req = servletRequest.getServletRequest();
SysUser user = UserUtil.getUser(req);
attributes.put("LOGIN_USER", user);
}
return super.beforeHandshake(request, response, wsHandler, attributes);
}
}js:// WebSocket对象
var url = crmUrl.replace("http://","ws://") + "/dataPresentationWebSocketServer.do";
var _webSocket = {
socket : null, // WebSocket连接对象
host : '', // WebSocket连接 url
connect : function() { // 连接服务器
window.WebSocket = window.WebSocket || window.MozWebSocket;
if (!window.WebSocket) { // 检测浏览器支持
top.showMsg("", "当前浏览器不支持WebSocket,无法更新数据", true, "warning");
return;
}
this.socket = new WebSocket(this.host); // 创建连接并注册响应函数
this.socket.onopen = onOpenCallBack;
this.socket.onmessage = onMessageCallBack;
this.socket.onclose = function(){
_webSocket.socket = null; // 清理
};
},
send : function(message) { // 发送消息方法
if (this.socket) {
this.socket.send(message);
return true;
}
top.showMsg("", "WebSocket未连接!", true, "warning");
return false;
}
};
// 初始化WebSocket连接 url
_webSocket.host = url; if(!_webSocket.socket){
//建立WebSocket连接
_webSocket.connect();
}
以上是代码,我在本机和sit环境测试的都没有问题,但是转测得时候由于域名格式不一样就有WebSocket connection to 'ws://crm.to3.mychebao.com/dataPresentationWebSocketServer.do' failed: Error during WebSocket handshake: Unexpected response code: 400这个问题
本机WebSocket地址是http://127.0.0.1:8080/crm-web/dataPresentationWebSocketServer.do
sit环境地址是http://boss.sit2.mychebao.com:8080/crm-web/dataPresentationWebSocketServer.do
转测之后地址是http://boss.to3.mychebao.com/dataPresentationWebSocketServer.do
转测之后的环境是把端口号、项目名全部集成在一个域名下,这个环境就会报这个错,求大神帮忙看一下!!
解决方案 »
- 我想通过java实现点击某个按钮打开命令提示符
- tomcat日志太多了咋办
- Cannot find class [org.springframework.jdbc.datasource.DriverManagerDataSource]
- JNI java.lang.UnsatisfiedLinkError: no KeyManager in java.library.path
- 哪位给个EJB3.0的简单例子看下?
- tomcate问题,请各位学长指教。
- [java新手求教]公司中一般搭建怎么样的环境来开发J2EE项目?
- 请教 关于jboss-3.0.4_tomcat-4.1.12 的配置。
- 求解啊啊啊
- java 类似tostring 的效果
- eclipse hadoop插件安装不显示?
- ssh在maven下整合报org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";请问在Nginx中加了这个,为啥还是一样的错?