【小結】java使用Websocket獲取HttpSession出現的問題
阿新 • • 發佈:2017-12-19
param conf 問題 point nbsp 請求 socket resp 繼承
websocket的寫法就不多說了,主要記一記其中出現的問題
1.獲取不到httpSession
解決辦法:先重寫握手方法,將httpsession放入ServerEndpointConfig.getUserProperties()方法返回的map中
1 import javax.servlet.http.HttpSession; 2 import javax.websocket.HandshakeResponse; 3 import javax.websocket.server.HandshakeRequest; 4 import javax.websocket.server.ServerEndpointConfig;5 import javax.websocket.server.ServerEndpointConfig.Configurator; 6 7 /** 8 * 繼承websocket配置類,將httpsession放入ServerEndpointConfig的map中 9 * 從而達到使websocket對象可以訪問到httpsession中的對象 10 */ 11 public class GetHttpSessionConfigurator extends Configurator{ 12 13 /** 14 * 重寫修改握手方法 15 * @paramsec 16 * @param request 17 * @param response 18 */ 19 @Override 20 public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { 21 HttpSession httpSession = (HttpSession)request.getHttpSession(); 22 sec.getUserProperties().put(HttpSession.class.getName(),httpSession); 23 } 24 }
然後在註解@ServerEndpoint加入configurator的配置
1 @ServerEndpoint(value="/websocket",configurator=GetHttpSessionConfigurator.class)
此時已經可以獲取到httpsession了。
然而如果我沒有登錄,反而需要臨時登錄這種情況呢?根據上述demo,會發現根本沒辦法連接上,一直是close狀態
下面是對這個問題的解決
2、未登錄用戶連接WebSocket,一直close狀態的情況解決:
解決方法是建立個請求監聽器
1 @WebListener 2 public class RequestListener implements ServletRequestListener { 3 4 public void requestInitialized(ServletRequestEvent sre) { 5 //將所有request請求都攜帶上httpSession 6 ((HttpServletRequest) sre.getServletRequest()).getSession(); 7 8 } 9 public RequestListener() { 10 // TODO Auto-generated constructor stub 11 } 12 13 public void requestDestroyed(ServletRequestEvent arg0) { 14 // TODO Auto-generated method stub 15 } 16 }
問題解決。
【小結】java使用Websocket獲取HttpSession出現的問題