作者:wqh3520来源:https://blog.csdn.net/wqh8522/article/details/78913841
WebSocket
WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。
该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或
socket消息推送流程
- 后台创建socket服务;
- 用户登录后与后台建立socket连接,默认使用websocket,如果浏览器不支持则使用scokjs连接;
- 建立连接后,服务端可以向用户推送信息;
javaweb中,socket的实现方式有多种,这里使用Spring-webscoket的方式实现。
demo
搭建环境
在SpringMVC的项目基础上,导入websocket的相关jar包。
org.springframework spring-websocket 4.1.9.RELEASEorg.springframework spring-messaging 4.1.9.RELEASE
websocket服务端实现类
这里使用的config配置的形式注册bean和配置,所以需要在SpringMVC的配置文件中添加对类的自动扫描
拦截器类
主要是获取到当前连接的用户,并把用户保存到WebSocketSession中
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { private static final Logger logger = LoggerFactory.getLogger(WebSocketHandshakeInterceptor.class); /** * 握手前 * @param request * @param response * @param webSocketHandler * @param attributes * @return * @throws Exception */ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Map attributes) throws Exception { logger.info("握手操作"); if (request instanceof ServletServerHttpRequest){ ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest) request; HttpSession session = servletServerHttpRequest.getServletRequest().getSession(false); if(session != null){ //从session中获取当前用户 User user = (User) session.getAttribute("user"); attributes.put("user