webSocket获取httpsession

websocket使用握手拦截器

public class HttpSessionHandshakeInterceptor extends org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        if (request instanceof HttpRequest){
          ServletServerHttpRequest httpRequest=(ServletServerHttpRequest) request;
            HttpSession session = httpRequest.getServletRequest().getSession();
            if (session!=null){
                //放入attributes中在wshandler中调用websocketsession.getAttributes.get("cueenetSession")即可获得session
                attributes.put("currentSession",session);
            }
        }

        return super.beforeHandshake(request,response,wsHandler,attributes);
    }
}

这是websocket的配置类

@Configuration
@EnableWebSocket
@EnableWebMvc
public class WebSocketConfig  implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry Registry) {
//在后面加入了握手拦截器        
        Registry.addHandler(myHandler(),"/websocket").addInterceptors(HandShakeInterceptor());
    }
    @Bean
    public WebsocketHandler myHandler(){
        return new WebsocketHandler();
    }
    @Bean
    public HttpSessionHandshakeInterceptor HandShakeInterceptor(){
        return new HttpSessionHandshakeInterceptor();
    }
}

以下是websockethandler

public class WebsocketHandler implements WebSocketHandler {
    /**
     * 连接人数
     */
    private static int onlineCounts=0;

    private static Map<String, WebSocketSession> clients = new ConcurrentHashMap<String, WebSocketSession>(20);
    /**
     * 连接时客户端session
     */
    private Session  session;
    /**
     * 用户名称,用于区分不同的用户session
     */
    private String username;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("开始连接...");
        //刚好有个session.getAttributes的方法是不是很巧
        HttpSession httpSession = (HttpSession) session.getAttributes().get("currentSession");
        User user = (User) httpSession.getAttribute("user");
        System.out.println(user.getUsername());
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        session.sendMessage(new TextMessage("hello client"));
        System.out.println("收到消息了");
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
      exception.printStackTrace();
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
      session.close();
    }

    @Override
    public boolean supportsPartialMessages() {
       return false;
    }


    public void setUsername(String username) {
        this.username = username;
    }



}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值