• jwt使用token传递前后端认证 实战项目演练


    一 jwt的使用方式

    客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage
    以后客户端每次与服务器通信,都要带上这个 JWT。

    方式1、可以放在 Cookie 里面自动发送,但是这样不能跨域

    方式2、更好的做法是放在 HTTP 请求的头信息Authorization字段里面

        Authorization: Bearer
        
    方式3、JWT放在POST请求的数据体body里面

    二  jwt工程搭建

    2.1  使用sringboot搭建工程

    这里使用springboot搭建工程,实现可以查询用户信息,不再赘述。

    工程搭建详见: springboot的持久化的crud操作(注解版)_健康平安的活着的博客-CSDN博客

    结构如下:

    2.2 jwt的token获取,存储

    在进行认证通过后,创建令牌获取token,返回给前端,核心代码:

     代码:

    1. @GetMapping("/user/login")
    2. public Map<String, Object> login(User user) {
    3. log.info("用户名:{}", user.getName());
    4. log.info("password: {}", user.getPassword());
    5. Map<String, Object> map = new HashMap<>();
    6. try {
    7. User userDB = userService.login(user);
    8. Map<String, String> payload = new HashMap<>();
    9. payload.put("id", userDB.getId());
    10. payload.put("name", userDB.getName());
    11. String token = JwtUtil.getToken(payload);
    12. map.put("state", true);
    13. map.put("msg", "登录成功");
    14. map.put("token", token);
    15. return map;
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. map.put("state", false);
    19. map.put("msg", e.getMessage());
    20. map.put("token", "");
    21. }
    22. return map;
    23. }

    3.验证

     2.3 jwt的token的验证

    假设要访问 :http://localhost:8981/user/verify  这个方法,但是需要进行token的验证合法性,这里需要添加一个拦截器,先进行过滤拦截,不合法则直接返回错误提示信息,如果合法则进行这个方法的执行,执行完成后返回给前端。

    2.3.1.拦截器d代码

    1. package com.ljf.jwt.intercepter;
    2. import com.auth0.jwt.exceptions.AlgorithmMismatchException;
    3. import com.auth0.jwt.exceptions.InvalidClaimException;
    4. import com.auth0.jwt.exceptions.SignatureVerificationException;
    5. import com.auth0.jwt.exceptions.TokenExpiredException;
    6. import com.fasterxml.jackson.databind.ObjectMapper;
    7. import com.ljf.jwt.util.JwtUtil;
    8. import lombok.extern.slf4j.Slf4j;
    9. import org.springframework.web.servlet.HandlerInterceptor;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;
    12. import java.util.HashMap;
    13. import java.util.Map;
    14. /**
    15. * Created by Chilly Cui on 2020/9/9.
    16. */
    17. @Slf4j
    18. public class JWTInterceptor implements HandlerInterceptor {
    19. @Override
    20. public boolean preHandle(HttpServletRequest request,
    21. HttpServletResponse response,
    22. Object handler) throws Exception {
    23. //获取请求头中的令牌
    24. String token = request.getHeader("Authorization");
    25. log.info("当前token为:{}", token);
    26. Map map = new HashMap<>();
    27. try {
    28. JwtUtil.verify(token);
    29. return true;
    30. } catch (SignatureVerificationException e) {
    31. e.printStackTrace();
    32. map.put("msg", "签名不一致");
    33. } catch (TokenExpiredException e) {
    34. e.printStackTrace();
    35. map.put("msg", "令牌过期");
    36. } catch (AlgorithmMismatchException e) {
    37. e.printStackTrace();
    38. map.put("msg", "算法不匹配");
    39. } catch (InvalidClaimException e) {
    40. e.printStackTrace();
    41. map.put("msg", "失效的payload");
    42. } catch (Exception e) {
    43. e.printStackTrace();
    44. map.put("msg", "token无效");
    45. }
    46. map.put("state", false);
    47. //响应到前台: 将map转为json
    48. String json = new ObjectMapper().writeValueAsString(map);
    49. response.setContentType("application/json;charset=UTF-8");
    50. response.getWriter().println(json);
    51. return false;
    52. }
    53. }

    2.3.2.注册启用拦截器

    1. package com.ljf.jwt.config;
    2. import com.ljf.jwt.intercepter.JWTInterceptor;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    6. /**
    7. * Created by Chilly Cui on 2020/9/9.
    8. */
    9. @Configuration
    10. public class InterceptorConfig implements WebMvcConfigurer {
    11. @Override
    12. public void addInterceptors(InterceptorRegistry registry) {
    13. registry.addInterceptor(new JWTInterceptor())
    14. .addPathPatterns("/user/verify") //加过滤验证,走拦截过滤,验证通过再走此请求的目标路径
    15. .excludePathPatterns("/user/login") //此请求不走拦截器请求过滤,直接到达目标访问的资源
    16. ;
    17. }
    18. }

    2.3.3 访问验证

    1.过期的情况

    2. 篡改token

    这里故意将token开头字母ey......;改为3y......; 再次请求,提示token无效

    3.正确的token

    5.springboot整合JWT使用(一)_哔哩哔哩_bilibili

    JWT〖一〗token单点登录认证逻辑实现_ktoking的博客-CSDN博客_jwt认证实现单点登录原理

    代码地址:https://gitee.com/jurf-liu/jwt-demo.git

  • 相关阅读:
    对象头(Object Header)
    物联网智能家居总体设计与实现
    java基础题--数组
    浙大数据结构慕课课后题(03-树2 List Leaves)
    ant design form数组修改 关联展示
    阿里架构师吐血整理:从源码到架构的Spring全系列笔记,已全部分享
    API网关那些事【架构新知系列】
    我是如何保护 70000 ETH 并赢得 600 万漏洞赏金的
    【漏洞分析】KaoyaSwap 安全事件分析
    【unity3D插件】Embedded Browser(ZFBrowser) — 快速实现PC端内嵌网页(有详细图解)
  • 原文地址:https://blog.csdn.net/u011066470/article/details/126215797