拦截器校验token

String字符串不相等判断问题
equals比较的是具体值,而==或 != 比较的是地址值
这样去使用

if(!user.getPassword().equals(password))

不要只写 isEmpty,如果 token为 null,会报空指针异常。

String token = request.getHeader("token");
if(token == null || token.isEmpty()){        // token 是否为空

校验 token

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(!(handler instanceof HandlerMethod)){
            return true;    // 静态资源直接放行
        }
        String token = request.getHeader("token");
        if(token == null || token.isEmpty()){        // token 是否为空
            System.out.println(token);
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            throw new BusinessException(Code.ACCESS_ERR,"未登录,无权访问");
        }else{
            try {
                jwtUtils.VerifyToken(token);
                ValueOperations<String, String> ops = redisTemplate.opsForValue();
                String res = ops.get(token);
                if(res == null || res.isEmpty()){
                    throw new BusinessException(Code.ACCESS_ERR,"token已过期");
                }else{
                    redisTemplate.expire(token,30, TimeUnit.MINUTES);
                    return true;
                }
            }catch(MalformedJwtException ex){
                throw new BusinessException(Code.ACCESS_ERR,"token 格式不对",ex);
            }catch(SignatureException ex){
                throw new BusinessException(Code.ACCESS_ERR,"token 不对",ex);
            }catch(ExpiredJwtException ex){
                throw new BusinessException(Code.ACCESS_ERR,"token已过期",ex);
            }
        }
    }
}
前端与Spring Boot拦截器进行Token校验的基本思路是:前端将用户登录时获取到的Token放在请求的Header中,Spring Boot拦截器通过拦截请求获取Header中的Token,然后根据Token进行校验。 下面是具体的步骤: 1. 前端在用户登录成功后,将Token保存在浏览器的本地存储(localStorage或sessionStorage)中,并在每次请求时将Token放在请求的Header中。例如: ``` axios.defaults.headers.common['Authorization'] = 'Bearer ' + token; ``` 2. Spring Boot拦截器通过实现HandlerInterceptor接口来拦截请求,并在拦截器中获取Header中的Token。例如: ``` public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); // 根据Token进行校验 if (token == null || !token.startsWith("Bearer ")) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } // ... return true; } // ... } ``` 3. 在Spring Boot的配置类中配置拦截器,使其生效。例如: ``` @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") .excludePathPatterns("/login"); } // ... } ``` 在上面的代码中,我们将TokenInterceptor添加到拦截器链中,并设置了拦截所有请求(除了/login)。 这样,当前端发送请求时,拦截器会拦截请求并获取Header中的Token,然后进行校验,如果校验不通过则返回401状态码,否则继续执行请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值