nginx版本:1.10.3
nginx1.3以后才支持websocket
因项目需要服务端推送消息到web,使用H5的websocket来实现。
js代码:
var websocket = null; var hostname = location.hostname; var port = location.port; var pathName=window.document.location.pathname; var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1); if ('WebSocket' in window) { websocket = new WebSocket("ws://" + hostname + ":" + port + projectName + "/websocket.do"); } else if ('MozWebSocket' in window) { websocket = new MozWebSocket("ws://" + hostname + ":" + port + projectName + "/websocket.do"); } else { websocket = new SockJS(hostname + ":" + port + projectName + "/sockjs/websocket.do"); } //已连接 websocket.onopen = function (event) { console.log("连接建立"); }; //省略...
服务端使用springMVC的webSocket,配置.do请求
//前台可以使用websocket环境 webSocketHandlerRegistry.addHandler(goodsWebsocketHandler(),"/websocket.do").addInterceptors(new HandshakInterceptor()); //前台不可以使用websocket环境 webSocketHandlerRegistry.addHandler(goodsWebsocketHandler(),"/sockjs/websocket.do").addInterceptors(new HandshakInterceptor()).withSockJS();
使用nginx代理端口请求时直接报403,查资料发现nginx必须配置协议头才能受理webSocket。
配置如下:
location /xhx/ { proxy_pass $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
结果还是报403,度娘后发现是Origin必须一致,对.do请求的代码做下修改,忽略Origin,加上下面代码:
.setAllowedOrigins("*")
//前台可以使用websocket环境 webSocketHandlerRegistry.addHandler(goodsWebsocketHandler(),"/websocket.do").addInterceptors(new HandshakInterceptor()).setAllowedOrigins("*"); //前台不可以使用websocket环境 webSocketHandlerRegistry.addHandler(goodsWebsocketHandler(),"/sockjs/websocket.do").addInterceptors(new HandshakInterceptor()).withSockJS();再试下,OK,问题解决!