KKSU
2025-02-17 1e6f177e264b130cb69e79e4325156989629ec85
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package cc.mrbird.febs.common.interceptor;
 
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import cc.mrbird.febs.user.entity.ChatMember;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
 
    private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String headerToken = request.getHeader("Token");
        if (StringUtils.isBlank(headerToken)) {
            responseUnAuth(response);
            return false;
        }
 
//        String token = resolveToken(headerToken);
        RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
        String token = rsa.decryptStr(headerToken, KeyType.PrivateKey);
 
        if (token == null || AppContants.TIME_OUT.equals(token)) {
            responseUnAuth(response);
            return false;
        }
 
        String userJsonStr = redisUtils.getString(token);
        if (StringUtils.isBlank(userJsonStr)) {
            responseUnAuth(response);
            return false;
        }
        ChatMember chatMember = JSON.parseObject(userJsonStr, ChatMember.class);
        request.getSession().setAttribute("chatMember", chatMember);
        log.info("登录用户{},{}",chatMember.getEmail(),token);
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
    }
 
    private void responseUnAuth(HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().write(new ObjectMapper().writeValueAsString(new FebsResponse().code(HttpStatus.UNAUTHORIZED)));
    }
 
    private String resolveToken(String token) {
        try {
            RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
            String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
            if (verifyTokenExpired(Long.parseLong(tokens[1]))) {
                return tokens[0];
            } else {
                return AppContants.TIME_OUT;
            }
        } catch (Exception e) {
            log.error("#解析token异常#", e);
            return null;
        }
    }
 
    private Boolean verifyTokenExpired(Long time) {
        boolean isDebug = true;
        if (!isDebug) {
            long currentTime = System.currentTimeMillis();
            return currentTime - time <= 30000;
        }
        return true;
    }
 
}