当前位置:   article > 正文

springboot3整合最新版jjwt(0.12.3)_springboot3 jwt

springboot3 jwt

目录

 1.application.yml文件配置

2.JwtUtil文件配置

3.JwtTokenAdminInterceptor拦截器

4.WebMvcConfiguration配置类

5.Controller层

6.测试农户户登录和添加农户

6.1.测试登录:

6.2.将token配置到全局参数里

6.3.测试添加农户操作


练习黑马的苍穹外卖时,因为黑马用的是springboot2,我打算使用springboot3写一个;于是下面就是springboot3整合jjwt:

项目环境:

SpringBoot:3.1.2

JDK:17

jjwt:0.12.3

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>${jjwt.version}</version>
</dependency>

引入这一个就行了

 1.application.yml文件配置

  1. ysy:
  2. jwt:
  3. # 设置jwt签名加密时使用的秘钥 HMAC-SHA算法32字节
  4. admin-secret-key: ysyysyysyysyysyysyysyysyysyysyys
  5. # 设置jwt过期时间
  6. admin-ttl: 7200000
  7. # 设置前端传递过来的令牌名称
  8. admin-token-name: token

2.JwtUtil文件配置

  1. import io.jsonwebtoken.*;
  2. import io.jsonwebtoken.io.Decoders;
  3. import io.jsonwebtoken.security.Keys;
  4. import io.jsonwebtoken.security.SecureDigestAlgorithm;
  5. import lombok.extern.slf4j.Slf4j;
  6. import javax.crypto.SecretKey;
  7. import javax.crypto.spec.SecretKeySpec;
  8. import java.nio.charset.StandardCharsets;
  9. import java.util.Date;
  10. import java.util.Map;
  11. /**
  12. * @ClassName JwtUtil工具类
  13. * @project agriBlissMart_common
  14. * @Description
  15. * @Version 1.0
  16. */
  17. @Slf4j
  18. public class JwtUtil {
  19. /**
  20. * 生成jwt
  21. * 使用Hs256算法,私钥使用固定密钥
  22. * @param secretKey jwt密钥
  23. * @param ttlMillis jwt过期时间,单位毫秒
  24. * @param claims 设置的信息
  25. * @return
  26. */
  27. public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims){
  28. //指定加密算法
  29. SecureDigestAlgorithm<SecretKey, SecretKey> algorithm = Jwts.SIG.HS256;
  30. //生成JWT的时间
  31. long expMillis = System.currentTimeMillis()+ttlMillis;
  32. Date exp = new Date(expMillis);
  33. //密钥实例
  34. SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());
  35. String compact = Jwts.builder()
  36. .signWith(key, algorithm) //设置签名使用的签名算法和签名使用的秘钥
  37. //如果有私有声明,一点要先设置这个自己创建的私有的声明,这个是给builder的claims赋值,一旦卸载标准的声明赋值之后,就是覆盖了那些标准的声明的
  38. .expiration(exp)
  39. .claims(claims) //设置自定义负载信息
  40. .compact();//设置过期时间
  41. return compact;
  42. }
  43. /**
  44. * 解析jwt
  45. * @param token
  46. * @param secretKey
  47. * @return
  48. */
  49. public static Jws<Claims> parseJWT(String token, String secretKey){
  50. //密钥实例
  51. SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());
  52. Jws<Claims> claimsJws = Jwts.parser()
  53. .verifyWith(key) //设置签名的密钥
  54. .build()
  55. .parseSignedClaims(token); //设置要解析的jwt
  56. return claimsJws;
  57. }
  58. }

3.JwtTokenAdminInterceptor拦截器

  1. import cn.ysy.constant.JwtClaimsConstant;
  2. import cn.ysy.context.BaseContext;
  3. import cn.ysy.properties.JwtProperties;
  4. import cn.ysy.utils.JwtUtil;
  5. import io.jsonwebtoken.Claims;
  6. import io.jsonwebtoken.Jws;
  7. import jakarta.servlet.http.HttpServletRequest;
  8. import jakarta.servlet.http.HttpServletResponse;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.apache.http.HttpStatus;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.method.HandlerMethod;
  14. import org.springframework.web.servlet.HandlerInterceptor;
  15. @Component
  16. @Slf4j
  17. public class JwtTokenAdminInterceptor implements HandlerInterceptor {
  18. @Autowired
  19. private JwtProperties jwtProperties;
  20. /**
  21. * 拦截器 校验jwt
  22. * @param request
  23. * @param response
  24. * @param handler
  25. * @return
  26. * @throws Exception
  27. */
  28. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
  29. //判断当前拦截到的是Controller的方法还是其他资源
  30. if(!(handler instanceof HandlerMethod)){
  31. //当前拦截到的不是动态方法,直接放行
  32. return true;
  33. }
  34. //从请求头中获取令牌
  35. String token = request.getHeader(jwtProperties.getAdminTokenName());
  36. //校验令牌
  37. try{
  38. log.info("jwt校验:{}",token);
  39. Jws<Claims> claimsJws = JwtUtil.parseJWT(token, jwtProperties.getAdminSecretKey());
  40. Long farId = Long.valueOf(claimsJws.getPayload().get(JwtClaimsConstant.FAR_ID).toString());
  41. log.info("当前农户id:{}",farId);
  42. BaseContext.setCurrentId(farId); //设置当前登录的用户id
  43. //放行
  44. return true;
  45. }catch (Exception e){
  46. //不通过,响应401状态码
  47. response.setStatus(HttpStatus.SC_UNAUTHORIZED);
  48. return false;
  49. }
  50. }
  51. }

4.WebMvcConfiguration配置类

这里面也定义了knife4j;具体的springboot3整合knife4j可以去我主页看看,也是有的

  1. import cn.ysy.interceptor.JwtTokenAdminInterceptor;
  2. import io.swagger.v3.oas.models.OpenAPI;
  3. import io.swagger.v3.oas.models.info.Contact;
  4. import io.swagger.v3.oas.models.info.Info;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  10. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  11. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  12. /**
  13. * 配置类,注册web层相关组件
  14. * @ClassName WebMvcConfiguration
  15. * @Description WebMvcConfiguration
  16. * @Version 1.0
  17. */
  18. @Slf4j
  19. @Configuration
  20. public class WebMvcConfiguration extends WebMvcConfigurationSupport {
  21. @Autowired
  22. private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
  23. /**
  24. * 注册拦截器
  25. * @param registry
  26. */
  27. protected void addInterceptors(InterceptorRegistry registry) {
  28. log.info("开始注册自定义拦截器。。。");
  29. registry.addInterceptor(jwtTokenAdminInterceptor)
  30. .addPathPatterns("/admin/**")
  31. .excludePathPatterns("/admin/farmer/login");
  32. }
  33. /**
  34. * 创建OpenAPI对象
  35. * @return OpenAPI
  36. */
  37. @Bean
  38. public OpenAPI springShopOpenAPI() {
  39. return new OpenAPI()
  40. .info(new Info()
  41. .title("农智云后台管理系统接口文档") // 接口文档标题
  42. .description("这是基于Knife4j OpenApi3的农智云后台管理系统的接口文档") // 接口文档简介
  43. .version("1.0") // 接口文档版本
  44. .contact(new Contact()
  45. .name("乆乄") //开发者
  46. .email("1234567896@qq.com")
  47. )
  48. ); // 开发者联系方式
  49. }
  50. /**
  51. * 添加静态资源映射
  52. * @param registry
  53. */
  54. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
  55. registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
  56. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  57. }
  58. }

5.Controller层

  1. import cn.ysy.constant.JwtClaimsConstant;
  2. import cn.ysy.dto.FarmerDTO;
  3. import cn.ysy.dto.FarmerLoginDTO;
  4. import cn.ysy.entity.Farmer;
  5. import cn.ysy.properties.JwtProperties;
  6. import cn.ysy.result.Result;
  7. import cn.ysy.service.FarmerService;
  8. import cn.ysy.utils.JwtUtil;
  9. import cn.ysy.vo.FarmerLoginVO;
  10. import io.swagger.v3.oas.annotations.Operation;
  11. import io.swagger.v3.oas.annotations.tags.Tag;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.*;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17. @RestController
  18. @Slf4j
  19. @Tag(name = "农户管理")
  20. @RequestMapping("/admin/farmer")
  21. public class FarmerController {
  22. @Autowired
  23. private FarmerService farmerService;
  24. @Autowired
  25. private JwtProperties jwtProperties;
  26. @PostMapping("/login")
  27. @Operation(description = "农户登录")
  28. public Result<FarmerLoginVO> login(@RequestBody FarmerLoginDTO farmerLoginDTO){
  29. log.info("登录请求参数:{}",farmerLoginDTO);
  30. Farmer farmer = farmerService.login(farmerLoginDTO);
  31. //登录成功后,生成jwt令牌
  32. Map<String, Object> claims = new HashMap<>();
  33. claims.put(JwtClaimsConstant.FAR_ID,farmer.getId());
  34. String token = JwtUtil.createJWT(
  35. jwtProperties.getAdminSecretKey(),
  36. jwtProperties.getAdminTtl(),
  37. claims);
  38. FarmerLoginVO farmerLoginVO = FarmerLoginVO.builder()
  39. .name(farmer.getName())
  40. .token(token)
  41. .id(farmer.getId())
  42. .build();
  43. return Result.success(farmerLoginVO);
  44. }
  45. /**
  46. * 农户退出
  47. * @return
  48. */
  49. @PostMapping("/logout")
  50. @Operation(description = "农户退出")
  51. public Result<String> logout(){
  52. return Result.success();
  53. }
  54. @PostMapping
  55. @Operation(description = "新增农户")
  56. public Result save(@RequestBody FarmerDTO farmerDTO){
  57. log.info("新增请求参数:{}",farmerDTO);
  58. farmerService.save(farmerDTO);
  59. return Result.success();
  60. }
  61. }

6.测试农户户登录和添加农户

启动项目。浏览器输入:http://localhost:8080/doc.html

6.1.测试登录:

6.2.将token配置到全局参数里

6.3.测试添加农户操作

不勾选时:

不勾选时后台是拿不到token的,所以不要忘记勾选

勾选时:

响应成功,刷新数据库查看信息;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/949811
推荐阅读
相关标签
  

闽ICP备14008679号