前言:
各位同学大家好,有段时间没有给大家更新文章了,具体多久我也不记得,最近有在用 springboot 写了一个本地的服务。因为客户端需要做到自动登录 需要生成token 所以需要学习了springboot中如何实现
那么废话不多说,我们正式开始
准备工作
1安装好idea 或者eclispe +sts开发环境
2安装maven 并配置环境
怎么使用idea 这个工具一键创建springboot工程
这些在我之前的教程都讲的很清楚 这里我就不展开细说 有兴趣的同学可以去看我以前的文章】
Springboot搭建零基础教程:https://www.jianshu.com/p/c48595fdbf39
需要用到三方库
<!--jsonwebtoken 生成token的库 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
-
1生成token
package com.example.boss.utils;
import com.example.boss.bean.User;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class CreateJwt {
public static String getoken(User user) {
//Jwts.builder()生成
//Jwts.parser()验证
JwtBuilder jwtBuilder = Jwts.builder()
.setId(user.getId()+"")
.setSubject(user.getUsername()) //用户名
.setIssuedAt(new Date())//登录时间
.signWith(SignatureAlgorithm.HS256, "my-123").setExpiration(new Date(new
Date().getTime()+86400000));
//设置过期时间
//前三个为载荷playload 最后一个为头部 header
System.out.println(jwtBuilder.compact());
return jwtBuilder.compact();
}
}
运行结果
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNSIsInN1YiI6Inh1cWluZyIsImlhdCI6MTYyNjUxMTE0NCwiZXhwIjoxNjI2NTk3NTQ0fQ.aievYRnhrBir2tlAQ1pE58CvVDmOvzieBECmZeuV3ak
-
解token
package com.example.boss.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.text.SimpleDateFormat;
//token的解析
//有状态登录 服务器端保存用户信息
//无状态登录 服务器端没有保存用户信息 无状态效率比有状态效率高
public class PraseJwtTest {
public static void tokenToOut(String token) {
Claims claims = Jwts.parser()
.setSigningKey("my-123")
.parseClaimsJws(token)
.getBody();
System.out.println("用户id:"+claims.getId());
System.out.println("用户名:"+claims.getSubject());
System.out.println("用户时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
format(claims.getIssuedAt()));System.out.println("过期时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
format(claims.getExpiration()));
System.out.println("用户角色:"+claims.get("role"));
}
}
输出日志查看效果
用户id:15
用户名:xuqing
用户时间:2021-07-17 16:39:04
过期时间:2021-07-18 16:39:04
结合springboot实战使用
一般我们使用token 现实场景是在客户端或者前端登录之后我们将用户名和userid 通过一种加密方式生成生命令牌(token)也就所谓的token 在登录成功后返回给客户端 客户端再其他接口请求的时候要通过请求头(请求头)或者body 里面传到后台来做校验 也有通过token刷新token来实现客户端的自动登录的一个情况
具体使用
-
登录接口
/***
*
* @param username
* @param password
* @return
* 登录
*
*/
@RequestMapping(value = "/validlogin")
public Object validLogin(@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password) {
Map<String, Object> map = new HashMap<>();
if (TextUtils.Isempty(username) || TextUtils.Isempty(password)) {
map= BackUtils.backmap(100);
} else {
User getUser = userService.validLogin(username, password);
if(getUser!=null){
String token=CreateJwt.getoken(getUser);
map.put("user",getUser);
map.put("token",token);
map.put("msg", "登录成功");
map.put("code", 200);
}else{
map.put("msg", "用户名或者密码错误");
map.put("code", 100);
}
}
return map;
}
我们在登录成功调用 CreateJwt.getoken(getUser) 方法传入我们的user 对象获取token 并且拼在map里面以json形式返回给客户端
测试效果
刷新token接口(token登录)
@RequestMapping("/tokensign")
public Object tokenSign(@RequestParam(value = "token")String token){
System.out.println("token ------ > " + token );
Map<String,Object>map=new HashMap<>();
if(TextUtils.Isempty(token)){
map.put("msg", "请求参数错误或者请求参数缺失");
map.put("code", 102);
}else {
try{
Claims claims = Jwts.parser()
.setSigningKey("my-123")
.parseClaimsJws(token)
.getBody();
Integer id=Integer.valueOf(claims.getId());
System.out.println("用户id:"+claims.getId());
System.out.println("用户名:"+claims.getSubject());
System.out.println("用户时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
format(claims.getIssuedAt()));
System.out.println("过期时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
format(claims.getExpiration()));
String username=claims.getSubject();
User user=userService.querybyid(id);
if(username!=null&&claims.getId()!=null&&username.equals(user.getUsername())){
String gettoken=CreateJwt.getoken(user);
map.put("user",user);
map.put("token",token);
map.put("msg", "登录成功");
map.put("code", 200);
}else {
map.put("msg", "token错误");
map.put("code", 100);
}
}catch (Exception E){
map.put("msg", "token格式正确");
map.put("code", 101);
}
}
return map;
}
我们在tokensign接口里面 我们拿到客户端的token 我们通过 Jwts.parser() 里面提供方法解开token 获取到token里面的携带userid 和username 然后我们通过userid 来查询数据库 然后将我们查到的数据里面username 和我们从token里面解出来username来对比是不是我们的真实用户 来给客户端返回是否能够正确登录
测试效果
到此SpringBoot 集成JWT实现token登录 我们就讲完了
最后总结
文章主要讲的是springboot里面使用 JWT 三方库的如何生成token 和解token 以及配合springboot 实现常用的token 登录功能。当然本文章使用的完整后端代码是 springboot+jpa + hibernate实现的。有兴趣的朋友可以下载完整代码,这里就不多讲。最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦