JWT放到拦截器中使用

maven进入包

<!--    start    jwt引入-->

<dependency>

<groupId>io.jsonwebtoken</groupId>

<artifactId>jjwt</artifactId>

<version>0.9.1</version>

</dependency>

<!--    end    jwt引入-->

新建一个类ResultVO作为返回前端的类型

package com.bruce.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * @Auther:BruceWong
 * @Date: 2021/6/16 - 06 - 16 - 11:15
 * @Description:com.bruce.vo
 * @Version: 1.0
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@ApiModel(value = "响应的VO对象",description = "封装接口返回给前端的数据")
public class ResultVO {

    @ApiModelProperty("响应状态码")
    private int code;

    @ApiModelProperty("响应提示信息")
    private String msg;

    @ApiModelProperty("响应数据内容")
    private Object data;

}

新建一个类TokenInterceptor并实现HandlerInterceptor

package com.bruce.interceptor;

import com.bruce.vo.ResultStatus;
import com.bruce.vo.ResultVO;
import com.bruce.vo.TokenSecret;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Component
public class TokenInterceptor implements HandlerInterceptor {


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

        String method = request.getMethod();

        if ("options".equalsIgnoreCase(method)) {
            return true;
        }

        String token = request.getHeader("token");

        if (token == null) {
            ResultVO resultVO = new ResultVO(ResultStatus.NO, "请先登录", null);
            doResponse(response, resultVO);
        } else {
            try {
                JwtParser parser = Jwts.parser();
                parser.setSigningKey(TokenSecret.SUFIX);
                Jws<Claims> claimsJws = parser.parseClaimsJws(token);
                return HandlerInterceptor.super.preHandle(request, response, handler);
            } catch (ExpiredJwtException e) {
                ResultVO resultVO = new ResultVO(ResultStatus.NO, "登录过期请重新登录", null);
                doResponse(response, resultVO);
            } catch (UnsupportedJwtException e) {
                ResultVO resultVO = new ResultVO(ResultStatus.NO, "Token不合法,请自重", null);
                doResponse(response, resultVO);
            } catch (Exception e) {
                ResultVO resultVO = new ResultVO(ResultStatus.NO, "请先登录", null);
                doResponse(response, resultVO);
            }
        }
        return false;
    }

    private void doResponse(HttpServletResponse response, ResultVO resultVO) throws IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String s = new ObjectMapper().writeValueAsString(resultVO);
        out.print(s);
        out.flush();
        out.close();
    }
}

新建一个拦截器的配置类InterceptorConfig并实现WebMvcConfigurer接口

package com.bruce.config;

import com.bruce.interceptor.TokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private TokenInterceptor checkTokenInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(checkTokenInterceptor)
                .addPathPatterns("/shopcart/**").addPathPatterns("/order/**")   //设置要拦截过滤的请求url
                .excludePathPatterns("/user/**");                               //设置不要要拦截过滤的请求url
    }
}

配置过后,当请求/shopcart或/order路径下的内容的时候,就会过滤判断如果没有发现token或者token有问题则会被拦截

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值