php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 523|回复: 0

SpringBoot实现基于token的登录验证

[复制链接]

3153

主题

3163

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7984
贡献
0
注册时间
2021-4-14
最后登录
2024-11-25
在线时间
764 小时
QQ
发表于 2022-5-23 15:05:27 | 显示全部楼层 |阅读模式
一.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
image.png
(2)调用查询用户接口,在请求头中加入token
image.png
(3)不携带token,调用查询接口
image.png
(4)token过期后,调用查询接口
image.png
以上就是一个简单的token登录机制
token登录机制的好处:不需要将登录信息保存在数据库或session中
token中还可以携带更多的用户信息,包括权限等





上一篇:奥迪广告导演另一宝马广告被指抄袭 多平台已下架作品
下一篇:【Java面试】简述一下你对线程池的理解?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-25 16:15 , Processed in 2.077973 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表