亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring中怎么利用websocket獲取HttpSession

發布時間:2021-08-03 11:36:21 來源:億速云 閱讀:454 作者:Leah 欄目:大數據

這期內容當中小編將會給大家帶來有關 spring中怎么利用websocket獲取HttpSession,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。


一個普通網站,用戶登錄后,將用戶信息存在HttpSession中。現在網站需要加入即時聊天功能,打算使用Websocket實現,需要在Websocket中拿到HttpSession來表示用戶。

    /**
     * 交流
     * @param chatMessage
     */
    @MessageMapping("/chat")
    public void chat(HttpSession session, @RequestBody ChatMessage chatMessage) {
        User user = (User)session.get("user");    // error
        chatService.chat(user,chatMessage);
    }

普通的注入HttpSession是不行的,因為Websocket連接建立后,并不會HTTP協議那樣,每次傳輸數據都會帶上sessionid。

解決思路
在Websocket連接建立階段(此時還是HTTP協議)攔截HTTP請求,獲取到HttpSesion并保存。

實現
本來想自己寫個類,但發現Spring Websocket已經提供了這樣的攔截器HttpSessionHandshakeInterceptor,直接使用即可。

Websocket 代理配置
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/chat");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/endpoint").setAllowedOrigins("*").addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS();
    }
}

這里和普通的Websocket配置差不多,最大的區別是addInterceptors(new HttpSessionHandshakeInterceptor()),它把HttpSessionHandshakeInterceptor加入到了攔截鏈中。
我們可以看一下HttpSessionHandshakeInterceptor源碼中的相關方法

// 在握手完成前(連接建立階段)
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        HttpSession session = this.getSession(request);     
        if (session != null) {
            if (this.isCopyHttpSessionId()) {
                attributes.put("HTTP.SESSION.ID", session.getId());  // 保存 sessionid
            }

            Enumeration names = session.getAttributeNames();

            while(true) {
                String name;
                do {
                    if (!names.hasMoreElements()) {
                        return true;
                    }

                    name = (String)names.nextElement();
                } while(!this.isCopyAllAttributes() && !this.getAttributeNames().contains(name));

                attributes.put(name, session.getAttribute(name));    // 保存HttpSession中的信息
            }
        } else {
            return true;
        }
}

// 獲取HttpSession
private HttpSession getSession(ServerHttpRequest request) {
        if (request instanceof ServletServerHttpRequest) {
            ServletServerHttpRequest serverRequest = (ServletServerHttpRequest)request;
            return serverRequest.getServletRequest().getSession(this.isCreateSession());
        } else {
            return null;
        }
}


通過源碼我們可以知道,HttpSessionHandshakeInterceptor將HttpSession中的值保存到了一個Map里面,通過搜索spring的官方文檔,我發現可以通過注入SimpMessageHeaderAccessor在Controller方法中獲取到那些值。

    /**
     * 交流
     * @param chatMessage
     */
    @MessageMapping("/chat")
    public void chat(SimpMessageHeaderAccessor headerAccessor, @RequestBody ChatMessage chatMessage) {
        User user = (User) headerAccessor.getSessionAttributes().get("user");  // right
        chatService.chat(user,chatMessage);
    }


上述就是小編為大家分享的 spring中怎么利用websocket獲取HttpSession了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

布拖县| 上蔡县| 双流县| 新野县| 穆棱市| 宁明县| 天门市| 上饶市| 宁海县| 辽宁省| 盐城市| 沧源| 丘北县| 通许县| 凌源市| 额尔古纳市| 莆田市| 牙克石市| 湾仔区| 精河县| 招远市| 三江| 万年县| 石泉县| 四子王旗| 芜湖县| 淅川县| 蓝田县| 博爱县| 永胜县| 手游| 溧阳市| 夏津县| 潼关县| 青铜峡市| 大丰市| 宜黄县| 丽水市| 惠安县| 福安市| 安义县|