• SpringBoot实现基于token的登录验证


    一.SpringBoot实现基于token的登录验证

    基于token的登录验证实现原理:客户端通过用户名和密码调用登录接口,当验证数据库中存在该用户后,将用户的信息按照token的生成规则,生成一个字符串token,返回给客户端,客户端在调用其他接口的时候,需要在请求头上带上token,来验证登录信息。

    二.Demo实现代码如下:

    (因为除登录接口外,其他接口每次都需要验证token信息,所以将验证token信息的部分放在了过滤器里面)

    1.导入JWT(JSON WEB TOKEN)依赖

     

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.6.0</version>
    </dependency>

     

    2.Jwt工具类,包括token的生成和验证(加密秘钥先自己随便写了一个)

     

    复制代码
    @Component
    public class JwtUitls {
        
        @Autowired
        private UserService userService;
        /**
         * 过期时间5分钟
         */
         private static final long EXPIRE_TIME=5*60*1000;
        /**
         * 加密密钥
         */
        private static final String KEY = "liuhongfei";
    
        /**
         * 生成token
         * @param id    用户id
         * @param userName  用户名
         * @return
         */
        public String createToken(String id,String userName){
            Map<String,Object>  header = new HashMap();
            header.put("typ","JWT");
            header.put("alg","HS256");
            //setID:用户ID
            //setExpiration:token过期时间  当前时间+有效时间
            //setSubject:用户名
            //setIssuedAt:token创建时间
            //signWith:加密方式
            JwtBuilder builder = Jwts.builder().setHeader(header)
                               .setId(id)
                               .setExpiration(new Date(System.currentTimeMillis()+EXPIRE_TIME))
                               .setSubject(userName)
                               .setIssuedAt(new Date())
                               .signWith(SignatureAlgorithm.HS256,KEY);
            return builder.compact();
        }
    
        /**
         * 验证token是否有效
         * @param token  请求头中携带的token
         * @return  token验证结果  2-token过期;1-token认证通过;0-token认证失败
         */
        public int verify(String token){
            Claims claims = null;
            try {
                //token过期后,会抛出ExpiredJwtException 异常,通过这个来判定token过期,
                claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
            }catch (ExpiredJwtException e){
              return 2;
            }
            //从token中获取用户id,查询该Id的用户是否存在,存在则token验证通过
            String id = claims.getId();
            User user = userService.selectUserById(id);
            if(user != null){
                return 1;
            }else{
                return 0;
            }
        }
    }
    复制代码

     

    3.过滤器,实现filter接口

     

    复制代码
    /**
    * @description:
    * @author: hwx
    * @date: 2022/05/23
    **/
    @Order(1)
    //如果我们有多个过滤器,那这个Order就可以指定优先级
    @Component
    //这里可以使用@Compent,也可以不加这个@Component,而是在@SpringBootApplication入口类上新增注解@ServletComponentScan。@Component也可以替换成@Configration
    @WebFilter(urlPatterns = "/*",filterName = "myFilter")
    public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("我是过滤器的初始化方法init");
    }

    @Override
    public void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException {
    System.out.println("我是过滤器的真正的执行方法doFilter,serverlet的请求,you are wanted one");
    HttpServletResponse httpServletResponse=(HttpServletResponse)var2;
    //允许的请求头字段
    httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept");
    //是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回
    httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
    //指定允许其他域名访问
    httpServletResponse.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8070");
    //参数 chain 为代表当前 Filter 链的对象。
    var3.doFilter(var1,httpServletResponse);
    System.out.println("我是过滤器的真正的执行方法doFilter,serverlet的请求,you are wanted two");
    }

    @Override
    public void destroy() {
    System.out.println("不行了,我要被销毁了");
    }
    }
    复制代码

     

    4.使用postman测试结果如下
    (1)调用login接口,返回token

     

     (2)调用查询用户接口,在请求头中加入token

     

     (3)不携带token,调用查询接口

     

     

     

     (4)token过期后,调用查询接口

     

     以上就是一个简单的token登录机制
    token登录机制的好处:不需要将登录信息保存在数据库或session中
    token中还可以携带更多的用户信息,包括权限等

     

     

     

     

     
  • 相关阅读:
    如何在 GNU Linux 上通过 Nvm 安装 Node 和 Npm?
    英码科技受邀亮相2023WAIE物联网与人工智能展,荣获行业优秀创新力产品奖!
    腾讯云服务器
    番外篇:Linux中好玩的指令(Ubuntu环境)
    Go uuid库介绍
    葡萄糖-聚乙二醇-阿奇霉素,Azithromycin-PEG-Glucose
    整数——算法专项刷题(一)
    java汇美食电子商城计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    js中的拖拽
    Less预处理——混合方法
  • 原文地址:https://www.cnblogs.com/xiaotian0422/p/16301189.html