jwt由三部分组成用.拼接
-
Header
-
Payload
-
Signature
依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
测试类
public class DemoApplicationTests {
//过期时间
private long time = 1000*60*60*24;
//key
private static String signature = "admin";
//加密
@Test
public void contextLoads() {
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
//Header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg","HS256")
//payload
.claim("username","tom")
.claim("role","admin")
.setSubject("admin-test") //签名
.setExpiration(new Date(System.currentTimeMillis()+time))
.setId(UUID.randomUUID().toString())
//Signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();
}
//解析token
@Test
public void parse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NjE1MDU0MTIsImp0aSI6IjY0OGFmMTM2LWEwY2EtNGRmZC1iZjhiLTA5ZjQ0Njg0YjI5NSJ9.whOUY5IwPSr-iyP_fGJgWt_812skGtsAia_m5ejJF_0";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
}
实体类
@Data
public class Userjwt {
private String username;
private String password;
private String token;
}
工具类
public class JwtUtil {
//有效时间
private static long time = 1000*60*60*24;
//key
private static String signature = "admin";
//生成json方法
public static String createToken(){
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
//Header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg","HS256")
//payload
.claim("username","admin")
.claim("role","admin")
.setSubject("admin-test") //签名
.setExpiration(new Date(System.currentTimeMillis()+time))
.setId(UUID.randomUUID().toString())
//Signature
.signWith(SignatureAlgorithm.HS256,signature)
.compact();
return jwtToken;
}
//解析token方法
public static boolean chechToken(String token) {
//判断token是否存在
if(token == null) {
return false;
}
//是否可以成功解析token
try {
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
} catch (Exception e) {
return false;
}
return true;
}
}
控制层
@RestController
@CrossOrigin //支持跨域
public class UserController {
private final String USERNAME = "admin";
private final String PASSWORD = "123123";
//生成并发送token
@GetMapping("/loginjwt")
public Userjwt loginjwt(Userjwt userjwt){
if(USERNAME.equals(userjwt.getUsername()) && PASSWORD.equals(userjwt.getPassword())) {
userjwt.setToken(JwtUtil.createToken());
return userjwt;
}
return null;
}
//解析json接口
@GetMapping("/checkToken")
public Boolean checkToken(HttpServletRequest request) {
String token = request.getHeader("token");
return JwtUtil.chechToken(token);
}
}
前端
路由index.js
router.beforeEach((to, from, next) => {
if (to.path.startsWith('/login')) {
window.localStorage.removeItem('access-admin')
next()
} else {
let admin = JSON.parse(window.localStorage.getItem('access-admin'))
if (!admin) {
next({path: '/login'})
} else {
//校验token合法性
axios({
url:'http://localhost:8080/checkToken',
method:'get',
headers:{
token:admin.token
}
}).then((response) => {
console.log(response.data)
if(!response.data){
console.log('校验失败')
next({path: '/error'})
}
})
next()
}
}
})
请求方法
handleSubmit(){
this.$refs.ruleForm.validate((valid) => {
if(valid){
let _this = this
axios.get('http://localhost:8080/login',{params:_this.ruleForm}).then(function (response) {
if(response.data!=null){
localStorage.setItem('access-admin',JSON.stringify(response.data))
_this.$router.replace({path:'/'})
}
})
}else{
console.log('error submit!');
return false;
}
})
}
js中将json转为字符串 JSON.stringify(json数据)
还原数据 JSON.parse()