拦截器代码编写(springmvc的核心之一)(登录使用)SpringSecurity

该文章描述了一个实现JWT访问令牌验证的拦截器,通过检查请求头中的Authorization字段获取token,并使用Redis存储和校验token的有效性。当token无效或不匹配时,会返回错误信息。配置文件中定义了拦截器的路径规则,排除特定不受拦截的URL。JwtUtils工具类用于生成、解析和校验JWTtoken。
摘要由CSDN通过智能技术生成
public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("Authorization");
        boolean result = true;
        String resultString = "";

//        TokenResult tokenResult = JwtUtils.parseToken(token);
//        重置时间
//        redisTemplate.opsForValue().set(RedisPrefixuUils.getKey(""), token);

        TokenResult tokenResult = JwtUtils.checkToken(token);

        if (tokenResult == null) {
            result=false;
            resultString="access token invalid";
        }else {
            String phone = tokenResult.getPhone();
            String identity = tokenResult.getIdentity();
            String tokenKey = RedisPrefixuUils.generatorTokenKey(phone, identity, TokenConstants.ACCESS_TOKEN_TYPE);
            String tokenRedis = redisTemplate.opsForValue().get(tokenKey);
            if (StringUtils.isEmpty(tokenRedis)||!StringUtils.equalsIgnoreCase(token.trim(),tokenRedis.trim())){
                result=false;
                resultString="access token invalid";
            }
        }

        if (!result) {
            PrintWriter writer = response.getWriter();
            writer.println(JSONObject.fromObject(ResponseResult.fail(resultString)).toString());
        }

        return result;
    }
}

对应的配置文件编写

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Bean
    public JwtInterceptor jwtInterceptor(){
        return new JwtInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor())
                .addPathPatterns("/**")//拦截的路径
                .excludePathPatterns("/noauthTest")//不拦截的路径
                .excludePathPatterns("/verification-code")//不拦截的路径
        ;

    }
}

JWT工具类

public class JwtUtils {
	//salt  盐
    public static final String SIGN = "CPFyuyang!@#$$";

    //生成token
    public static String generatorateToken(Map<String, String>map){

        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });

        //token时间设定
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE,30);
        Date time = instance.getTime();
        builder.withExpiresAt(time);
        //生成token
        String sign = builder.sign(Algorithm.HMAC256(SIGN));

        return sign;
    }


	//解析token
    public static Map<String, Claim> parseToken(String token){
        DecodedJWT jwt = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
        String age = jwt.getClaim("age").asString();  //主题内容
        System.out.println("age = " + age);
        System.out.println("jwt.getToken() = " + jwt.getToken());
        System.out.println("jwt.getHeader() = " + jwt.getHeader());
        Map<String, Claim> claims = jwt.getClaims();
        System.out.println("claims = " + claims);
        return claims;

    }

	/**
     * 校验token
     * @param token
     * @return
     */
    public static TokenResult checkToken(String token){
        try {
            TokenResult tokenResult = JwtUtils.parseToken(token);
            return tokenResult;
        } catch (Exception e) {
            return null;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值