WebSocket 握手階段無法直接訪問 HttpSession,需從握手請求的 Query String 中解析。
// 握手攔截器中
String queryStr = request.getQueryString(); // 如 "token=abc%2Bdef%3D"
String decoded = URLDecoder.decode(queryStr, "UTF-8"); // "token=abc+def="
// 解析 token 並查詢用戶信息存入 WebSocket Session
@Component
public class MyHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
WebSocketHandler wsHandler, Map attributes) {
String query = request.getURI().getQuery();
if (query != null) {
String decoded = URLDecoder.decode(query, StandardCharsets.UTF_8);
// 解析參數,查詢用戶,放入 attributes
attributes.put("currentUser", userService.findByToken(token));
}
return true;
}
}
必須在握手階段完成用戶識別,後續消息處理直接從 attributes 取用戶對象。