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中还可以携带更多的用户信息,包括权限等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探