Effect
WebSocket Browser is not supported, use Flash to simulate websocket. Of course, you can also use the flash socket to connect directly with the service socket.
In fact, the WebSocket protocol is relatively simple, using ActionScript simulation is also relatively simple, this in another article of this cock let IE6 7 8 9 support HTML5 WebSocket simply said.
In addition, Spring provides APIs for SOCKJS, simply configured to be compatible with the lower version of the browser, the principle is to use JS simulation WebSocket object. The concrete cock hasn't gone to see it yet.
A few notes:
1. The use of spring for websocket encapsulation can be used either separately or with spring MVC. Note that when used alone, you still have to configure spring's dispatcher in Web.xml and still open the server.
<servlet>
<servlet-name>websocket</servlet-name>
<servlet-class> org.springframework.web.servlet.dispatcherservlet</servlet-class>
<init-param>
< param-name>contextconfiglocation</param-name>
<param-value>
/web-inf/ Applicationcontext.xml
</param-value>
</init-param>
<load-on-startup>1</ load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>websocket</ servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. When used alone, if refer cross domain, you need to set up whitelist in spring
<websocket:handlers allowed-origins= "*" > ...
</websocket:handlers>
3. Due to the use of flash, you need to open 843 ports, and in Flash request policy file, return policy file. The example is Netty4.
4. The handshake needs to be intercepted and monitored. Because in the back WebSocket processing class, Unable to get session from Websocketsession. In addition, get session here to save to Arrtibutes, in the WebSocket processing class, websocketsession invoke GetAttributes () method to get the arrtibutes.
public class Chatintercepter extends httpsessionhandshakeinterceptor{@Override p
Ublic boolean beforehandshake (serverhttprequest request, serverhttpresponse response, Websockethandler Wshandler,
map<string, object> attributes) throws Exception {if (Request instanceof Servletserverhttprequest) {
Servletserverhttprequest ServletRequest = (servletserverhttprequest) request;
HttpSession session = Servletrequest.getservletrequest (). GetSession (false);
if (session!= null) {String userName = (string) session.getattribute ("User");
Attributes.put ("User", UserName);
} System.out.println ("Before Handshake" +request.getheaders ());
return Super.beforehandshake (Request, response, Wshandler, attributes);
return true;
}
..............
}
5. In Web-socket-js, the WebSocket header information in Flash simulation contains cookies, but is manually added by the script. Therefore, to avoid the need for cookies, such as the session cookie is httponly. This requires setting up the container.
If you are currently developing in eclipse
You can see Adding usehttponly= ' false ' on the Context tab, which is added automatically when eclipse is deployed.
If it's already packaged, go to the Tomcat directory/conf/server.xml, add the last </Host> before
Copy Code code as follows:
<context docbase= "WebSocket" path= "/websocket" reloadable= "true" usehttponly= ' false '/>
The meaning is the whole content of this article, I hope you can enjoy it.