springmvc集成websocket
环境:spring+springmvc+tomcat8
注意:本测试项目 运行环境不能低于tomcat8
1.websocket配置
package club.jiajiajia.connom.service.impl;
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.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
/**
* webSocket配置
* @author LENOVO
*/
@Configuration
@EnableWebSocket
@EnableWebMvc
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(myHandler(),"/socket.do").addInterceptors(new HandshakeInterceptor());
webSocketHandlerRegistry.addHandler(myHandler(),"/socket/info").addInterceptors(new HandshakeInterceptor()).withSockJS();
}
@Bean
public WebSocketHandler myHandler(){
return new WebSocketHandler();
}
}
2.会话拦截器
package club.jiajiajia.connom.service.impl;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import java.util.Map;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 会话拦截器
* @author LENOVO
*/
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
HttpSession session = servletRequest.getSession();
String id=(String) session.getAttribute("socketId");
if(id!=null&&servletRequest.getParameter("type").equals(id)) {
attributes.put("socketId",id);
return super.beforeHandshake(request, response, wsHandler, attributes);
}else {
return false;
}
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Exception ex) {
super.afterHandshake(request, response, wsHandler, ex);
}
}
3.websocket消息处理器
package club.jiajiajia.connom.service.impl;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
* websocket处理器
* @author LENOVO
*/
public class WebSocketHandler extends TextWebSocketHandler {
public static Map<String,WebSocketSession> map=new HashMap<String,WebSocketSession>();
private String id;
//连接建立后处理
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String id=(String) session.getAttributes().get("socketId");
this.id=id;
System.out.println(id+":建立链接");
if(!map.containsKey(id)) {
map.put(id, session);
}else {
session.close();
}
super.afterConnectionEstablished(session);
}
//抛出异常时处理
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
if(map.containsKey(this.id)) {
map.remove(this.id);
}
}
}
//连接关闭后处理
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
try {
if(map.containsKey(this.id)) {
map.remove(this.id);
}
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//接收文本消息,并发送出去
@Override
protected void handleTextMessage(WebSocketSession session,TextMessage message) throws Exception {
super.handleTextMessage(session, message);
}
public static boolean sendMessage(String id,String message) {
if(map.containsKey(id)) {
WebSocketSession session=map.get(id);
TextMessage m=new TextMessage(message);
try {
session.sendMessage(m);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}else {
return false;
}
}
}
4.applicationContext.xml配置
<!-- 配置好处理器 -->
<bean id="websocketHandler" class="club.jiajiajia.connom.service.impl.WebSocketHandler"/>
<!-- 配置拦截器 -->
<websocket:handlers>
<websocket:mapping path="/socket.do" handler="websocketHandler"/><!-- 连接的URL -->
<websocket:handshake-interceptors>
<bean class="club.jiajiajia.connom.service.impl.HandshakeInterceptor"/>
</websocket:handshake-interceptors>
</websocket:handlers>
5.测试controller
package club.jiajiajia.connom.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import club.jiajiajia.connom.service.impl.WebSocketHandler;
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public String test(HttpSession session,String id) {
session.setAttribute("socketId",id);
return "index2";
}
@RequestMapping("/send")
@ResponseBody
public String test(HttpSession session,String id,String message) {
try {
WebSocketHandler.sendMessage(id, message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "send error";
}
return "send success";
}
}
6.简单jsp测试页面
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<div>
测试 websocket
</div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
var ws;
window.onload=connect;
function connect(){
if ('WebSocket' in window) {
ws = new WebSocket("ws://"+window.location.host+"/websocket/socket.do?type=123");
} else {
ws = new SockJS("http://"+window.location.host+"/websocket/socket/info?type=123");
}
ws.onopen = function (evnt) {
console.log("websocket连接成功");
};
ws.onmessage = function (evnt) {
console.log("websocket接收到一条新消息:");
console.log(evnt);
};
ws.onerror = function (evnt) {
};
ws.onclose = function (evnt) {
}
}
</script>
</body>
</html>
添加的依赖如下:
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
spring配置文件头文件
xmlns:websocket="http://www.springframework.org/schema/websocket"
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket.xsd
7.看看效果
地址:http://localhost:8080/websocket/test/test?id=123

然后向上一个链接发送消息:http://localhost:8080/websocket/test/send?id=123&message=哈哈哈,该回家吃饭了

回到上一个页面看看结果
发送成功

本项目只是做一个简单的测试
如果有兴趣的话可以尝试设计更复杂的demo