博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebSocket 使用,同时获取HttpSession,并注入springBean
阅读量:6689 次
发布时间:2019-06-25

本文共 4831 字,大约阅读时间需要 16 分钟。

1. 添加jar包

javax.websocket
javax.websocket-api
1.1
provided
org.springframework
spring-websocket
5.1.5.RELEASE
org.springframework
spring-messaging
5.1.5.RELEASE

2. 配置类

@EnableWebSocket@Configurationpublic class WebSocketConfig {//    @Bean//    public ServerEndpointExporter serverEndpointExporter() {  //        return new ServerEndpointExporter();  //    }  }

3 .  从websocket中获取用户session

public class HttpSessionConfigurator extends Configurator{    @Override    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {        HttpSession httpSession = (HttpSession) request.getHttpSession();        sec.getUserProperties().put(HttpSession.class.getName(), httpSession);    }}

4 . 设置监听

@WebListener@Componentpublic class RequestListener implements ServletRequestListener{    @Override    public void requestDestroyed(ServletRequestEvent sre) {        ServletRequestListener.super.requestDestroyed(sre);    }    @Override    public void requestInitialized(ServletRequestEvent sre) {        //将所有request请求都携带上httpSession        ((HttpServletRequest) sre.getServletRequest()).getSession();    }    public RequestListener() {    }}

5. 获取spring容器工具类

@Component@Lazy(false)public class ApplicationContextRegister implements ApplicationContextAware {    private static ApplicationContext APPLICATION_CONTEXT;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        APPLICATION_CONTEXT = applicationContext;    }    public static ApplicationContext getApplicationContext() {        return APPLICATION_CONTEXT;    }}

6. webSocket服务类

@Component@ServerEndpoint(value = "/onlineUser", configurator = HttpSessionConfigurator.class)public class WebSocketServer {        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。    private static int onlineCount = 0;    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。    private static CopyOnWriteArraySet
webSocketSet = new CopyOnWriteArraySet
(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; //用来存放在线用户 //private static CopyOnWriteArraySet
user = new CopyOnWriteArraySet(); /** * 用户标识 */ private String userId; /** * 连接建立成功调用的方法 * */ @OnOpen public void onOpen(Session session,EndpointConfig config) { UserLoginDao userLoginDao = (UserLoginDao) ApplicationContextRegister.getApplicationContext().getBean(UserLoginDao.class); HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName()); this.session = session; webSocketSet.add(this); //加入set中 this.userId = ((UserPo)httpSession.getAttribute("user")).getUserId(); addOnlineCount(); //在线数加1 userLoginDao.online(this.userId, 1); //user.add(httpSession.getAttribute("user")); //httpSession.setAttribute("websocket", this); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { UserLoginDao userLoginDao = (UserLoginDao) ApplicationContextRegister.getApplicationContext().getBean(UserLoginDao.class); HttpSession httpSession= (HttpSession) this.session.getUserProperties().get(HttpSession.class.getName()); userLoginDao.online(this.userId, 0); //user.remove(httpSession.getAttribute("user")); webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息*/ @OnMessage public void onMessage(String message, Session session) { } /** * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { error.printStackTrace(); } /** * 实现服务器主动推送 */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 群发自定义消息 * */ public static void sendInfo(String message) throws IOException { } public static synchronized int getOnlineCount() { return onlineCount; } private static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } private static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; }// public static CopyOnWriteArraySet getUser() {// return user;// } public static CopyOnWriteArraySet
getWebSocketSet() { return webSocketSet; }}

转载于:https://www.cnblogs.com/wdp1990/p/11058245.html

你可能感兴趣的文章
Python3快速入门(四)——Python包管理
查看>>
QT开发(三十八)——Model/View框架编程
查看>>
Docker镜像与容器命令
查看>>
Java基础学习总结(7)——Object类
查看>>
Myeclipse优化配置
查看>>
Spring常用注解
查看>>
windows 10常用快捷键举例
查看>>
关于 logger
查看>>
Oracle 约束的基础知识介绍
查看>>
下一代前端打包工具与tree-shaking
查看>>
web前端响应式设计总结
查看>>
安全配置,关闭iis 错误页面显示详细内容
查看>>
网页客户端无法打开citrix ica后缀文件
查看>>
Orchestrator 2012r2之 创建自动部署虚拟机runbook
查看>>
js中用gb2312编码解码
查看>>
细谈测试---我的启示录
查看>>
Unity自定义mesh绘制
查看>>
nagios安装
查看>>
好用的省、市、地区联动JS封装类
查看>>
Dalvik字节码的类型,方法与字段表示方法
查看>>