1。前言
webSoket 無法獲取 HttpSession ,使用就更談不上了 !!!
2解決過程
使用 configurator 注入即可
(1)
配置一個類
1 package cn.cen2guo.clinic.websocket; 2 3 4 import javax.servlet.http.HttpSession; 5 import javax.websocket.HandshakeResponse; 6 import javax.websocket.server.HandshakeRequest; 7 import javax.websocket.server.ServerEndpointConfig; 8 9 10 /** 11 * 用於從websocket中獲取用戶session 12 */ 13 public class HttpSessionConfigurator extends ServerEndpointConfig.Configurator { 14 15 @Override 16 public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { 17 HttpSession httpSession = (HttpSession) request.getHttpSession(); 18 sec.getUserProperties().put(HttpSession.class.getName(), httpSession); 19 } 20 }
(2)websocket業務類注入 HttpSessionConfigurator.class
(3)onOpen里面的額使用方法
可以用 config 來獲取 ,也可以以當前會話session來獲取
測試截圖:
3 . 經驗:
當前會話session 都保存起來,這樣就可以對其他會話session進行操作了
擔心線程安全問題,可使用 ConcurrentMap<String, Map<String, List<Object>>> messageMap=new ConcurrentHashMap<>();
當然,里面的泛型則根據需要自己定義 ,ConcurrentMap 的用法 與Map一樣,唯一區別就是自帶同步鎖,線程安全
在@OnOpen方法里 將當前會話session設為全局變量,於是,在其他方法里都可以使用session獲取 HttpSession !!!
如 :@OnClose 方法里面 ,完美使用,
有些方法里面自帶當前會話session參數 ,那么既 可以使用 已經在@onOpen記錄的session [this.session] ,也可以使用該方法注入的session
.