JWT 的实现原理和基本代码实现
JWT是什么
JWT是一种基于JSON的令牌安全验证(在某些特定的场合可以替代Session或者Cookie),一次生成随处校验
JWT的组成
JWT分为三部分:头部信息(header),消息体playload,签名( signature)
-
头部信息(header)
作用:该JWT使用的签名
内容格式:{
“alg”: “HS256”,// 签名使用的算法
“typ”: “JWT” //token类型
}将内容用Base64URL 算法转成字符串,即为header
-
消息体playload
作用:JWT的请求数据
内容格式:{
“exp” (expiration time):过期时间
“sub” (subject):主题,一般用用户id,用来标识用户会话
“iat” (Issued At):签发时间
}将内容用Base64URL 算法转成字符串,即为playload
-
签名( signature)
作用:防止数据篡改
内容格式:加密(base64编码(header) + “.” +base64编码(payload), 秘钥)
JWT = header.payload.signature
代码实现
依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
JWT工具类
public class JwtUtil {
/**
* 自定义密钥,仅服务端存储
*/
private static String secret = "ko346134h_we]rg3in_yip1!";
/**
*
* @param subject
* @param issueDate 签发时间
* @return
*/
public static String createToken(String subject, Date issueDate) {
Calendar c = Calendar.getInstance();
c.setTime(issueDate);
c.add(Calendar.DAY_OF_MONTH, 20);
String compactJws = Jwts.builder()
.setSubject(subject)
.setIssuedAt(issueDate)
.setExpiration(c.getTime())
.signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, secret)
.compact();
return compactJws;
}
/**
* 解密 jwt
* @param token
* @return
* @throws Exception
*/
public static String parseToken(String token) {
try {
Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
if (claims != null){
return claims.getSubject();
}
}catch (ExpiredJwtException e){
e.printStackTrace();
System.out.println("jwt过期了");
}
return "";
}
}
自定义Filter校验
@WebFilter(filterName = "authFilter", urlPatterns = "/**")
@Component
public class MyFi implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String token = req.getHeader("token");
if (token != null) {
// 判断解析token是否成功
String parseToken = JwtUtil.parseToken(token);
if (!StringUtils.isEmpty(parseToken)) {
System.out.println("auth success");
chain.doFilter(request, response);
}
} else {
System.out.println("auth failed");
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("来了老弟");
Filter.super.init(filterConfig);
}
}