请求时,为什么要携带token?

token是什么?

token携带在请求头中,只有登录请求不需要携带token,登录成功后把token返回给前端,以后的请求前端需要携带这个token来才能请求成功!否则请求被拦截……

为什么要用它?

token的目的是减轻服务器压力,减少数据库请求。

如果没有token做一层拦截的,每次请求都会去请求数据库,如果恶意请求,很可能击垮数据库…

如何实现呢?

拦截器:写一个类实现HandlerInterceptor接口,重写preHandle方法,在方法里实现拦截逻辑

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 如果是OPTIONS则结束请求
        if (Objects.equals(request.getMethod(), HttpMethod.OPTIONS.name())) {
            response.setStatus(HttpStatus.OK.value());
            return false;
        }
        String token = request.getHeader("token");
        if (!hasText(token)) {
            handleErrorResponse(response, ResponseResultEnum.PARAM_ERROR, "can't getHeader token ");
            return false;
        }
        if (TEST_TOKEN.equals(token)) {
            return true;
        } 
        } catch (JwtException e) {
            log.trace(e.getMessage(), e);
            handleErrorResponse(response, ResponseResultEnum.TOKEN_INVALID);
            return false;
        }
     return true;
    }

这里的拦截,是拦截所有请求,而我们在实际开发中,要有拦截白名单,比如:登录接口

那么如何写拦截白名单呢?

写一个配置类,实现WebMvcConfigurer接口,重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final TokenInterceptor tokenInterceptor;

    public WebConfig(TokenInterceptor tokenInterceptor) {
        this.tokenInterceptor = tokenInterceptor;
    }

    /**
     * 不需拦截-白名单
     */
    private static final String[] WHITELIST = {
            // 登录相关
            "/login/verify",
            "/login/sms/**",
            "/heartbeat"
    };
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> patterns = Arrays.asList(WHITELIST);
        registry.addInterceptor(tokenInterceptor) // 拦截器实例
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns(patterns); // 排除哪些请求
    }

}

small  tips:

1.JWT:JSON WEB TOKEN,用于生产token的插件

 Jwts.builder()
                .setIssuedAt(new Date())
                .signWith(this.key)
                .claim(Global.USER_CODE, userCode)
                .claim(Global.PHONE, phone)
                .claim(Global.UNION_NUM, unionNum)
                .setExpiration(new Date(System.currentTimeMillis() + this.expiration))
                .setId(UUID.randomUUID().toString())
                .compact();

使用以上,需要导入jar包

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>

token设置多久有效期?

根据具体情况来定,失效时间写在生成token的方法里,token的失效时间一般存在缓存或内存中,而不会数据库中

 public String generateTokenCache(String userCode, String phone, String unionNum) {
        String token = generateToken(userCode, phone, unionNum);
        String key = String.format(RedisConstants.APP_TOKEN_KEY, userCode);
        redisTemplate.opsForValue().set(key, ShaKit.hashString(token), this.expiration, TimeUnit.MILLISECONDS);
        return token;
    }

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值