JWT是json web token的简写,意为json格式的token。
什么是token
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
组成部分
header(头部)
header的作用主要是表明Signature使用的加密算法和token的类型
Payload(负载)
用于存放我们需要校验的信息,不要存放敏感信息,譬如密码。因为header和payload只经过base64编码,并没有加密是可以获取到的
Signature(签名)
这部分由header和payload的base64编码经过服务端的秘钥(这个很关键)加密组成。当用户携带这个token访问服务端时,我们就可以进行授权验证,如果payload被修改了,验证是不会通过的
依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
简单的工具类
public class JWTUtils {
private static final String SIGN = "231@$#!$@";//秘钥
//生成token
public static String getToken(String userName,String userID){
JWTCreator.Builder builder = JWT.create();
builder.withClaim("username",userName);
builder.withClaim("userID",userID);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE,7);//token过期时间,7天
String token = builder.withExpiresAt(calendar.getTime())//设置token过期时间
.sign(Algorithm.HMAC512(SIGN));//使用秘钥进行加密
return token;
}
//验证token,验证不成功会抛出异常
public static void verifierToken(String token){
JWT.require(Algorithm.HMAC512(SIGN)).build().verify(token);
}
}
工具类中我们并没有设置header这是因为,它有默认的。我们登录以后返回给客户端一个token,客户端可以将其设置在localStorage中或者cookie中,以后每次方法都将其携带上(推荐放在请求头中),然后后端拦截获取请求头的token,验证是否有被篡改,如果没有就放行
编写自定义拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
try{
//验证是否不正确,不正确会抛出异常
JWTUtils.verifierToken(token);
return true;
}catch (Exception e){
response.getWriter().print("error token");
}
return false;
}
}
将自定义拦截器添加至配置中
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/user/**")//拦截的请求
.excludePathPatterns("/login/**");//放行的请求
}
}
至此jwt的简单使用就结束了,Controller正常编写即可。
JWT是JSON Web Token的简称,用于在各方之间安全地传递信息。本文介绍了JWT的三个组成部分:header、payload和signature,以及如何在客户端和服务器间使用token进行身份验证。文中还详细讲解了如何编写自定义拦截器并将之添加到配置中,以确保JWT的有效性和安全性。
6199

被折叠的 条评论
为什么被折叠?



