最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WebSocket獲取httpSession空指針異常的解決辦法

 更新時(shí)間:2025年01月15日 10:32:58   作者:csu_zipple  
這篇文章主要介紹了在使用WebSocket實(shí)現(xiàn)p2p或一對(duì)多聊天功能時(shí),如何獲取HttpSession來(lái)獲取用戶信息,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

小坑:使用requestListner解決不了這個(gè)問(wèn)題!

如何獲取HttpSession

在使用webSocket實(shí)現(xiàn)p2p或者一對(duì)多聊天功能的時(shí)候我們經(jīng)常會(huì)有這樣的需求:webSocket服務(wù)端需要獲取到用戶使用數(shù)據(jù)庫(kù)的用戶信息登錄后的HttpSession獲取個(gè)人資料信息。
于是,你會(huì)使用這樣的代碼:

package com.xinyulee.ws;
import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import javax.websocket.server.ServerEndpointConfig.Configurator;
/**
 * Created by zipple on 2017/11/14.
 * 協(xié)助server獲取http session
 */
public class HttpSessionWSHelper extends Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        System.out.println("調(diào)用modifyHandshake方法...");
        HttpSession session = (HttpSession) request.getHttpSession();//session有可能為空
        if (session!=null){
            System.out.println("獲取到session id:"+session.getId());
            sec.getUserProperties().put(HttpSession.class.getName(),session);
        }else{
            System.out.println("modifyHandshake 獲取到null session");
        }
    }
}

然后在服務(wù)端這樣配置:

@ServerEndpoint(value ="/chatRoom/{username}",configurator=HttpSessionWSHelper.class,encoders = {ServerEncoder.class})
//encoders = {ServerEncoder.class}用于指定sendObject()方法調(diào)用的解析器

RequestListner解決不了這個(gè)問(wèn)題的原因

在使用上述方法配置完成以后我滿懷信心的進(jìn)行測(cè)試,但是意外的發(fā)現(xiàn)了Tomcat Localhost Log下報(bào)了null pointer exception。
經(jīng)過(guò)調(diào)試,發(fā)現(xiàn)了modifyHandshake方法并不能獲取到HttpSession,在上述HttpSessionWSHelper 類代碼中可以看到我對(duì)它進(jìn)行了判空處理。但是這樣并不能起到什么實(shí)際上的作用。我們需要弄明白為什么HandshakeRequest 獲取不到HttpSession。
一開(kāi)始,我試著去百度了一下,發(fā)現(xiàn)有這樣的代碼:

package com.xinyulee.listener;
import com.xinyulee.util.Log;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by zipple on 2017/11/14.
 */
@WebListener
public class RequestListener implements ServletRequestListener {
    public void requestInitialized(ServletRequestEvent sre)  {
        //將所有request請(qǐng)求都攜帶上httpSession----這樣會(huì)創(chuàng)建新的session!導(dǎo)致重新創(chuàng)建了會(huì)話
        Log.info("request--:"+sre.getServletRequest().getLocalAddr());
       ((HttpServletRequest) sre.getServletRequest()).getSession();
    }
    public RequestListener() {
        // TODO Auto-generated constructor stub
    }
    public void requestDestroyed(ServletRequestEvent arg0)  {
        // TODO Auto-generated method stub
    }
}

網(wǎng)上解釋說(shuō),是因?yàn)檫M(jìn)行ws連接的時(shí)候并沒(méi)有HttpSession處于激活狀態(tài),于是便不能獲取到HttpSession。他們給出的解決辦法是對(duì)每一個(gè)request請(qǐng)求調(diào)用sre.getServletRequest()).getSession()方法。
這樣的確可以解決空指針異常的問(wèn)題,但是新問(wèn)題又出現(xiàn)了。
在沒(méi)有HttpSession激活狀態(tài)的時(shí)候,使用getSession()方法會(huì)新建一個(gè)HttpSession,也就是說(shuō)實(shí)際上這個(gè)監(jiān)聽(tīng)器是在沒(méi)有激活HttpSession的情況下不斷新建會(huì)話。
這樣已經(jīng)完全偏離了我們程序的需求:獲取同時(shí)在線的HttpSession中保存的個(gè)人信息。
那么怎么辦呢?
事實(shí)上,這個(gè)空指針異常的根源并不是出在我們后端代碼上。

localhost和127.0.0.1其實(shí)并不是同一個(gè)連接

在前端連接WebSocket的時(shí)候,我的代碼是這樣的:

loadWS("ws://127.0.0.1/chatRoom/null");

然而瀏覽器地址欄是這樣的:

http://localhost:8080/

網(wǎng)上解釋說(shuō)如果不使用同一個(gè)host,則會(huì)創(chuàng)建不同的連接請(qǐng)求。具體細(xì)節(jié)有興趣的朋友可以去了解一下。
于是我們可以這樣拼接一下:

var host = window.location.host;
var url = "ws://"+host+"/chatRoom/null";

這樣便可以正常建立ws請(qǐng)求,并且能夠使用自定義的HttpSessionWSHelper 類獲取到HttpSession了。

到此這篇關(guān)于WebSocket獲取httpSession空指針異常的解決辦法的文章就介紹到這了,更多相關(guān)WebSocket獲取httpSession空指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 高并發(fā)計(jì)數(shù)器LongAdder 實(shí)現(xiàn)原理與使用場(chǎng)景詳解

    高并發(fā)計(jì)數(shù)器LongAdder 實(shí)現(xiàn)原理與使用場(chǎng)景詳解

    這篇文章主要介紹了高并發(fā)計(jì)數(shù)器LongAdder 實(shí)現(xiàn)原理與使用場(chǎng)景詳解,通過(guò)理解 LongAdder 的設(shè)計(jì)哲學(xué)和實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)者可以在高并發(fā)場(chǎng)景中做出更優(yōu)的技術(shù)選型,在保證線程安全的前提下實(shí)現(xiàn) 5-10 倍的性能提升,需要的朋友可以參考下
    2025-06-06
  • Spring Boot Jar 文件能直接運(yùn)行的操作方法

    Spring Boot Jar 文件能直接運(yùn)行的操作方法

    本文將深入探討 Spring Boot 的打包過(guò)程及其運(yùn)行原理,揭示其 JAR 文件如何巧妙地集成依賴項(xiàng)、嵌入 Web 容器并實(shí)現(xiàn)自動(dòng)配置,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java繼承關(guān)系中構(gòu)造器的使用詳解

    Java繼承關(guān)系中構(gòu)造器的使用詳解

    本文介紹了繼承關(guān)系中構(gòu)造器的使用要點(diǎn),創(chuàng)建子類對(duì)象時(shí),必須先調(diào)用父類構(gòu)造器實(shí)現(xiàn)初始化,若父類無(wú)參構(gòu)造器被覆蓋,子類需用super顯式調(diào)用父類構(gòu)造器,且super須寫在構(gòu)造器首行,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件

    SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件

    這篇文章主要介紹了SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot如何獲取application.properties中自定義的值

    SpringBoot如何獲取application.properties中自定義的值

    這篇文章主要介紹了SpringBoot獲取application.properties中的自定義的值,目錄結(jié)構(gòu)文件代碼給大家列舉的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java 8 Stream.distinct() 列表去重的操作

    Java 8 Stream.distinct() 列表去重的操作

    這篇文章主要介紹了Java 8 Stream.distinct() 列表去重的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java的JNI快速入門教程(推薦)

    Java的JNI快速入門教程(推薦)

    下面小編就為大家?guī)?lái)一篇Java的JNI快速入門教程(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • mybatis-plus實(shí)現(xiàn)自定義SQL、多表查詢與多表分頁(yè)查詢語(yǔ)句實(shí)例

    mybatis-plus實(shí)現(xiàn)自定義SQL、多表查詢與多表分頁(yè)查詢語(yǔ)句實(shí)例

    mybatisplus是個(gè)很好用的插件,相信小伙伴們都知道,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實(shí)現(xiàn)自定義SQL、多表查詢與多表分頁(yè)查詢語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之前綴,中綴和后綴表達(dá)式

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之前綴,中綴和后綴表達(dá)式

    這篇文章主要為大家介紹了Java的前綴,中綴和后綴表達(dá)式 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java實(shí)現(xiàn)圖片拼接

    Java實(shí)現(xiàn)圖片拼接

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片拼接的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評(píng)論

余江县| 永丰县| 新晃| 云梦县| 商水县| 沈阳市| 时尚| 肥城市| 武冈市| 阿鲁科尔沁旗| 黎川县| 晋州市| 诸城市| 略阳县| 湘乡市| 固阳县| 扬中市| 张家界市| 漳浦县| 铁力市| 永清县| 铜山县| 上杭县| 天祝| 茌平县| 九龙坡区| 星座| 随州市| 哈巴河县| 连州市| 浑源县| 灌南县| 茶陵县| 精河县| 鸡东县| 沅陵县| 定西市| 和田市| 花莲市| 离岛区| 韶关市|