springboot整合token的实现代码
写在前面
- 在前后端交互过程中,为了保证信息安全,我们往往需要加点用户验证。本文介绍了用springboot简单整合token。
- springboot版本2.2.0。另外主要用到了jjwt,redis。阅读本文,你大概需要花费7-10分钟时间
整合token
1.导入相关依赖
pom.xml文件中
io.jsonwebtoken jjwt 0.9.0
2.TokenUtil.java实现生成/解析token
packagecom.dbc.usermanager.util; importcom.dbc.usermanager.service.RedisService; importio.jsonwebtoken.Claims; importio.jsonwebtoken.JwtBuilder; importio.jsonwebtoken.Jwts; importio.jsonwebtoken.SignatureAlgorithm; importorg.springframework.beans.factory.annotation.Autowired; importjavax.crypto.spec.SecretKeySpec; importjavax.xml.bind.DatatypeConverter; importjava.security.Key; importjava.util.Date; publicclassTokenUtil{ /** *签名秘钥,可以换成秘钥注入 */ publicstaticfinalStringSECRET="DaTiBao";//注意:本参数需要长一点,不然后面剪切的时候很可能长度为0,就会报错 /** *签发地 */ publicstaticfinalStringissuer="dtb.com"; /** *过期时间 */ publicstaticfinallongttlMillis=3600*1000*60; /** *生成token * *@paramid一般传入userName *@return */ publicstaticStringcreateJwtToken(Stringid,Stringsubject){ returncreateJwtToken(id,issuer,subject,ttlMillis); } publicstaticStringcreateJwtToken(Stringid){ returncreateJwtToken(id,issuer,"",ttlMillis); } /** *生成Token * *@paramid编号 *@paramissuer该JWT的签发者,是否使用是可选的 *@paramsubject该JWT所面向的用户,是否使用是可选的; *@paramttlMillis签发时间(有效时间,过期会报错) *@returntokenString */ publicstaticStringcreateJwtToken(Stringid,Stringissuer,Stringsubject,longttlMillis){ //签名算法,将对token进行签名 SignatureAlgorithmsignatureAlgorithm=SignatureAlgorithm.HS256; //生成签发时间 longnowMillis=System.currentTimeMillis(); Datenow=newDate(nowMillis); //通过秘钥签名JWT byte[]apiKeySecretBytes=DatatypeConverter.parseBase64Binary(SECRET); Stringstr=signatureAlgorithm.getJcaName(); KeysigningKey=newSecretKeySpec(apiKeySecretBytes,str); //让我们设置JWT声明 JwtBuilderbuilder=Jwts.builder().setId(id) .setIssuedAt(now) .setSubject(subject) .setIssuer(issuer) .signWith(signatureAlgorithm,signingKey); //ifithasbeenspecified,let'saddtheexpiration if(ttlMillis>=0){ //过期时间 longexpMillis=nowMillis+ttlMillis; Dateexp=newDate(expMillis); builder.setExpiration(exp); } //构建JWT并将其序列化为一个紧凑的url安全字符串 returnbuilder.compact(); } /** *Token解析方法 *@paramjwtToken *@return */ publicstaticClaimsparseJWT(Stringjwt){ //如果这行代码不是签名的JWS(如预期),那么它将抛出异常 Claimsclaims=Jwts.parser() .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET)) .parseClaimsJws(jwt).getBody(); returnclaims; } publicstaticvoidmain(String[]args){ Stringtoken=TokenUtil.createJwtToken("2","ltz"); System.out.println(TokenUtil.createJwtToken("2","ltz")); Claimsclaims=TokenUtil.parseJWT(token); System.out.println(claims); } }
3.新增登录验证的注解@LoginRequired
packagecom.dbc.usermanager.util; importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; //加入此注解,就需要token @Target({ElementType.METHOD,ElementType.TYPE})//表明此注解可用在方法名上 @Retention(RetentionPolicy.RUNTIME)//运行时有效 public@interfaceLoginRequired{ booleanrequired()defaulttrue; }
4.测试
@PostMapping(value="test") @ApiOperation(value="生成token") publicResultJsontest(@RequestBodyJSONObjectrequestJson){ Stringtoken=TokenUtil.createJwtToken("1","dtb"); redisService.set(token,"1"); returnnewResultJson(0,"测试成功",null); } @GetMapping(value="getToken") @LoginRequired @ApiOperation("") publicResultJsongetToken(Stringtoken){ if(redisService.exists(token)){ System.out.println(redisService.get(token)); } returnnewResultJson(0,"测试成功",null); }
最后
- 实体类User.java等相关文件就不贴出来了,大家可以用自己写好的实体类去编写。
- 很多步骤与思想都在代码中体现,代码中也加了很多注释,你可以根据自己的需求进行增删查改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。