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有问题则会被拦截

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWTJSON Web Token)是一种用于在网络应用之间传递声明的基于 JSON 的开放标准。Spring Boot 提供了一种简单的方式来实现 JWT 的认证和授权,可以与 Spring Boot 的拦截器配合使用。 以下是使用 JWT 和 Spring Boot 拦截器实现认证和授权的基本步骤: 1. 添加依赖 在 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. 创建 JWT 工具类 创建一个 JWT 工具类,用于生成和解析 JWT。 ```java public class JwtUtils { private static final String SECRET_KEY = "mySecretKey"; public static String createToken(User user) { return Jwts.builder() .setSubject(user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (JwtException | IllegalArgumentException e) { return false; } } public static String getUsernameFromToken(String token) { return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject(); } } ``` 3. 创建拦截器 创建一个拦截器,用于在请求到达控制器前对 JWT 进行认证和授权。 ```java @Component public class JwtInterceptor implements HandlerInterceptor { private static final String AUTHORIZATION_HEADER = "Authorization"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader(AUTHORIZATION_HEADER); if (StringUtils.hasText(token) && token.startsWith("Bearer ")) { token = token.substring(7); if (JwtUtils.validateToken(token)) { String username = JwtUtils.getUsernameFromToken(token); request.setAttribute("username", username); return true; } } response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } ``` 4. 注册拦截器 在 Spring Boot 应用程序注册拦截器。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private JwtInterceptor jwtInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor).excludePathPatterns("/login"); } } ``` 在上面的示例,我们排除了 `/login` 路径,因为该路径不需要进行认证和授权。 5. 在控制器获取用户名 在控制器获取用户的用户名。 ```java @RestController public class UserController { @GetMapping("/user") public String getUser(@RequestAttribute("username") String username) { return "Hello, " + username; } } ``` 在上面的示例,我们使用 `@RequestAttribute` 注解获取在拦截器设置的 `username` 属性。 以上就是使用 JWT 和 Spring Boot 拦截器实现认证和授权的基本步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值