Spring webosket 握手拦截器中获取不到session

J2EE 码拜 8年前 (2016-03-16) 2375次浏览
最近项目需要是用websocket  所以用了spring的websocket
代码如下:
登录controller中代码如下
package com.web.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.web.entity.User;
@Controller
@RequestMapping(“/login”)
public class UserController
{
@RequestMapping(“/toLogin”)
public String toLogin()
{
return “/login”;
}
@RequestMapping(“/denglu”)
public String denglu(User user, HttpServletRequest request)
{
System.out.println(“enter to the denglu”);
System.out.println(user.toString());
System.out.println(“–“);
request.getSession().setAttribute(“mcn”, user.getMcn());
return “chat”;
}
}
websockt握手拦截器如下
package com.web.socket;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor
{
@Override
public void afterHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1,
WebSocketHandler arg2, Exception arg3)
{
System.out.println(“enter the afterHandshake”);
}
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse arg1, WebSocketHandler handler,
Map<String, Object> attribute) throws Exception
{
System.out.println(“enter the beforeHandshake”);
if(request instanceof ServerHttpRequest){
ServletServerHttpRequest servletRequest=(ServletServerHttpRequest) request;
HttpSession session=servletRequest.getServletRequest().getSession(false);
if(session!=null){
String userName=(String) session.getAttribute(“mcn”);
attribute.put(“userName”, userName);
}
}
return true;
}
}
处理类如下
package com.web.socket;
import java.io.IOException;
import java.util.ArrayList;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
public class SystemWebSocketHandler implements WebSocketHandler {

private static final ArrayList<WebSocketSession> users;

static {
users = new ArrayList<>();
}

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
users.add(session);
String userName = (String) session.getAttributes().get(“userName”);
if(userName!= null){
//查询未读消息

}
}

@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

System.out.println(“enter the handlemessage”);
System.out.println(message.getPayload().toString());
//sendMessageToUsers();
}

@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
users.remove(session);
}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
users.remove(session);
}

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

/**
* 给全部在线用户发送消息
*
* @param message
*/
public void sendMessageToUsers(TextMessage message) {
for (WebSocketSession user : users) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 给某个用户发送消息
*
* @param userName
* @param message
*/
public void sendMessageToUser(String userName, TextMessage message) {
for (WebSocketSession user : users) {
if (user.getAttributes().get(“userName”).equals(userName)) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
}
当用户登录跳转到聊天界面的时候在握手拦截器中取到的session为null    谁做过能帮本人分析下么?谢谢

解决方案

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Spring webosket 握手拦截器中获取不到session
喜欢 (0)
[1034331897@qq.com]
分享 (0)