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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。