当前位置:   article > 正文

【三】springboot整合token_spring boot token

spring boot token

互相交流入口地址 

整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

目录

第一步:新增依赖(在pom文件增加) 

第二步:新增配置类

第三步:新增token工具类(用来生成token以及效验token) 

第四步:改造登陆接口

第五步:演示结果


介绍:接下来我会把学习阶段学到的框架等知识点进行整合,每一次整合是在前一章的基础上进行的,所以后面的整合不会重复放前面的代码。每次的demo我放在结尾,本次是接着上一章的内容延续的,只增加新增的或者修改的代码。

整合token,每次请求接口时进行token效验,效验通过才可以请求到接口,我是通过jwt生成的token。token个人理解大概就是用来判断用户登录状态,是否已登录的。

        首先展示一下目录结构,是根据前面几章进行的增加(原因:内容过多),如下:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

第一步:新增依赖(在pom文件增加) 

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.projectlombok</groupId>
  8. <artifactId>lombok</artifactId>
  9. <optional>true</optional>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. <!--swagger -->
  17. <dependency>
  18. <groupId>io.springfox</groupId>
  19. <artifactId>springfox-swagger2</artifactId>
  20. <version>2.9.2</version>
  21. </dependency>
  22. <!--swagger-ui.html模式 -->
  23. <dependency>
  24. <groupId>io.springfox</groupId>
  25. <artifactId>springfox-swagger-ui</artifactId>
  26. <version>2.9.2</version>
  27. </dependency>
  28. <!--doc.html模式 -->
  29. <dependency>
  30. <groupId>com.github.xiaoymin</groupId>
  31. <artifactId>swagger-bootstrap-ui</artifactId>
  32. <version>1.9.2</version>
  33. </dependency>
  34. <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
  35. <dependency>
  36. <groupId>com.auth0</groupId>
  37. <artifactId>java-jwt</artifactId>
  38. <version>3.9.0</version>
  39. </dependency>
  40. <!-- https://mvnrepository.com/artifact/org.json/json -->
  41. <dependency>
  42. <groupId>org.json</groupId>
  43. <artifactId>json</artifactId>
  44. <version>20190722</version>
  45. </dependency>
  46. </dependencies>

        其实就增加了jwt和json两个依赖。

第二步:新增配置类

TokenInterceptor类(拦截器):
  1. @Component
  2. public class TokenInterceptor implements HandlerInterceptor {
  3. @Override
  4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  5. //跨域请求会首先发一个option请求,直接返回正常状态并通过拦截器
  6. if(request.getMethod().equals("OPTIONS")){
  7. response.setStatus(HttpServletResponse.SC_OK);
  8. return true;
  9. }
  10. response.setCharacterEncoding("utf-8");
  11. String token = request.getHeader("token");
  12. if (token!=null){
  13. boolean result= TokenUtils.verify(token);
  14. if (result){
  15. System.out.println("通过拦截器");
  16. return true;
  17. }
  18. }
  19. response.setContentType("application/json; charset=utf-8");
  20. try {
  21. JSONObject json=new JSONObject();
  22. json.put("msg","token verify fail");
  23. json.put("code","500");
  24. response.getWriter().append(json.toString());
  25. System.out.println("认证失败,未通过拦截器");
  26. } catch (Exception e) {
  27. return false;
  28. }
  29. /**
  30. * 还可以在此处检验用户存不存在等操作
  31. */
  32. return false;
  33. }
  34. }
PS:此处token从request里面获取header里面的key值是token,你要根据自己的情况来,你在前端header里面传的token叫什么名称,这里就取什么名字。 
WebConfiguration类(配置拦截器):
  1. @Configuration
  2. public class WebConfiguration implements WebMvcConfigurer {
  3. @Autowired
  4. private TokenInterceptor tokenInterceptor;
  5. /**
  6. * 解决跨域请求
  7. * @param registry
  8. */
  9. @Override
  10. public void addCorsMappings(CorsRegistry registry) {
  11. registry.addMapping("/**")
  12. .allowedHeaders("*")
  13. .allowedMethods("*")
  14. // .allowedOrigins("*")
  15. .allowedOriginPatterns("*")
  16. .allowCredentials(true);
  17. }
  18. /**
  19. * 异步请求配置
  20. * @param configurer
  21. */
  22. @Override
  23. public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
  24. configurer.setTaskExecutor(new ConcurrentTaskExecutor(Executors.newFixedThreadPool(3)));
  25. configurer.setDefaultTimeout(30000);
  26. }
  27. /**
  28. * 配置拦截器、拦截路径
  29. * 每次请求到拦截的路径,就会去执行拦截器中的方法
  30. * @param configurer
  31. */
  32. @Override
  33. public void addInterceptors(InterceptorRegistry registry) {
  34. List<String> excludePath = new ArrayList<>();
  35. //排除拦截,除了注册登录(此时还没token),其他都拦截
  36. excludePath.add("/userController/login"); //登录
  37. excludePath.add("/userController/register"); //注册
  38. excludePath.add("/doc.html"); //swagger
  39. excludePath.add("/swagger-ui.html"); //swagger
  40. excludePath.add("/swagger-resources/**"); //swagger
  41. excludePath.add("/v2/api-docs"); //swagger
  42. excludePath.add("/webjars/**"); //swagger
  43. // excludePath.add("/static/**"); //静态资源
  44. // excludePath.add("/assets/**"); //静态资源
  45. registry.addInterceptor(tokenInterceptor)
  46. .addPathPatterns("/**")
  47. .excludePathPatterns(excludePath);
  48. WebMvcConfigurer.super.addInterceptors(registry);
  49. }
  50. }
PS:addInterceptors方法里面需要按自己情况进行修改,excludePath集合add的是需要放行的接口路径,前几章整合了swagger,所以此处需要放行swagger相关的路径,swagger-ui.html、doc.html、swagger-resources、等等,你再加上自己想要放行的接口路径即可,一般是首页请求的接口以及登录注册的接口(不需要进行token效验的接口)。

第三步:新增token工具类(用来生成token以及效验token) 

  1. public class TokenUtils {
  2. //token到期时间10小时
  3. private static final long EXPIRE_TIME= 10*60*60*1000;
  4. //密钥盐
  5. private static final String TOKEN_SECRET="ljdyaishijin**3nkjnj??";
  6. /**
  7. * 生成token
  8. * @param user
  9. * @return
  10. */
  11. public static String sign(User user){
  12. String token=null;
  13. try {
  14. Date expireAt=new Date(System.currentTimeMillis()+EXPIRE_TIME);
  15. token = JWT.create()
  16. //发行人
  17. .withIssuer("auth0")
  18. //存放数据
  19. .withClaim("username",user.getUserName())
  20. //过期时间
  21. .withExpiresAt(expireAt)
  22. .sign(Algorithm.HMAC256(TOKEN_SECRET));
  23. } catch (IllegalArgumentException|JWTCreationException je) {
  24. }
  25. return token;
  26. }
  27. /**
  28. * token验证
  29. * @param token
  30. * @return
  31. */
  32. public static Boolean verify(String token){
  33. try {
  34. //创建token验证器
  35. JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
  36. DecodedJWT decodedJWT=jwtVerifier.verify(token);
  37. System.out.println("认证通过:");
  38. System.out.println("username: " + decodedJWT.getClaim("username").asString());
  39. System.out.println("过期时间: " + decodedJWT.getExpiresAt());
  40. } catch (IllegalArgumentException |JWTVerificationException e) {
  41. //抛出错误即为验证不通过
  42. return false;
  43. }
  44. return true;
  45. }
  46. }
PS:此处到期时间可以自定义按情况进行设置,1000是1秒。此处token的生成方法以及效验方法可以根据具体情况进行更改,生成token1是使用的jwt,此处验证方法存在一个用户有多个token的情况(可以同时多次登陆同一账号,重新请求token之后,前一次的token只要没有过期也能使用。),可以整合redis后进行改造(后面会讲到),可以达到一个用户只有一个token的效果(重新请求token之后,前一次的token即使没有过期也不能使用。)

第四步:改造登陆接口

  1. @ApiOperation(value = "登录")
  2. @GetMapping("/login")
  3. @ApiImplicitParams({
  4. @ApiImplicitParam(name = "userName", value = "用户名", paramType = "String"),
  5. @ApiImplicitParam(name = "passWord", value = "密码", paramType = "String")
  6. })
  7. public BaseResponse<HashMap> login(@RequestParam(value = "userName") String userName, @RequestParam(value = "passWord") String passWord) throws JsonProcessingException {
  8. //包装token
  9. User user = new User();
  10. user.setUserName(userName);
  11. user.setPassword(passWord);
  12. String token= TokenUtils.sign(user);
  13. HashMap<String,Object> hs=new HashMap<>();
  14. hs.put("token",token);
  15. return RespGenerator.returnOK(hs);
  16. }
PS:可以根据自己的情况包装数据作为登录请求的返回结果。

第五步:演示结果

        1、当请求没有放行的接口不带token请求时: 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        结果:会提示token效验失败。

        2、当请求放行的接口不带token请求时:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        结果:成功请求到接口,此处是登陆接口,返回了token。

        3、当请求没有放行的接口带token请求时: 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

         结果:成功请求到接口。

本期整合到此完毕,接下来会继续更新加强整合,尽情期待。

访问地址:http://localhost:8085/swagger-ui.html或者http://localhost:8085/doc.html

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

闽ICP备14008679号