package com.ltkj.web.websocket.interceptor;
|
|
import com.ltkj.common.core.domain.model.LoginUser;
|
import com.ltkj.framework.web.service.TokenService;
|
import io.jsonwebtoken.Claims;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.server.ServerHttpRequest;
|
import org.springframework.http.server.ServerHttpResponse;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.socket.WebSocketHandler;
|
import org.springframework.web.socket.server.HandshakeInterceptor;
|
|
import java.net.URI;
|
import java.util.Map;
|
|
@Component
|
public class TokenHandshakeInterceptor implements HandshakeInterceptor {
|
@Autowired
|
private TokenService tokenService;
|
|
@Override
|
public boolean beforeHandshake(ServerHttpRequest request,
|
ServerHttpResponse response,
|
WebSocketHandler wsHandler,
|
Map<String, Object> attributes) {
|
URI uri = request.getURI();
|
String query = uri.getQuery();
|
String token = null;
|
if (query != null && query.startsWith("token=")) {
|
token = query.substring("token=".length());
|
}
|
if (token == null) {
|
System.out.println("[WebSocket] 令牌无效拒绝");
|
return false;
|
}
|
LoginUser validToken = isValidToken(token);
|
if (validToken == null) {
|
System.out.println("[WebSocket] 令牌无效拒绝");
|
return false;
|
}
|
attributes.put("user", validToken);
|
return true;
|
}
|
|
@Override
|
public void afterHandshake(ServerHttpRequest request,
|
ServerHttpResponse response,
|
WebSocketHandler wsHandler,
|
Exception exception) {
|
}
|
|
private LoginUser isValidToken(String token) {
|
String tokenStr = token.replace("Bearer", "").trim();
|
Claims claims = tokenService.parseToken(tokenStr);
|
return tokenService.getLoginUser(claims);
|
}
|
|
|
}
|