java使用Websocket獲取HttpSession出現的問題與解決


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      * @param sec
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 }

問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM