第一步添加依赖
java
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
第二步,配置yaml
java
jwt:
tokenHeader: Authorization #JWT存储的请求头
secret: mall-jwt-test #jwt加解密使用的密钥
expiration: 604800 #JWT的超时时间
tokenHead: Bearer #JWT负载中拿到的开头代码片
编写配置类
java
package com.example.demo.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* JWT配置类,读取Application.yml中的配置
*
* @author AdminMall
*
*/
@Setter
@Getter
@Configuration
public class JwtConfig {
@Value("${jwt.tokenHeader}")
private String tokenHeader; // JWT存储的请求头
@Value("${jwt.secret}")
private String secret; // jwt加解密使用的密钥
@Value("${jwt.expiration}")
private long expiration; // JWT的超时时间
@Value("${jwt.tokenHead}")
private String tokenHead; // JWT负载中拿到的开头
}
第三步,编写拦jwt生成工具类
java
package com.example.demo.utils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.example.demo.config.JwtConfig;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.demo.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
/**
*
* JWT工具类
*
* @author MAll
*
*
*/
@Component
public class JwtKit {
@Autowired
private JwtConfig jwtConfig;
/**
* 生成Token
*
* @param user 自定义要存储的用户对象信息
* @return
*/
public String generateToken(User user) {
Map<String, Object> claims = new HashMap<String, Object>();
claims.put("name", user.getName());
claims.put("createdate", new Date());
claims.put("id", System.currentTimeMillis());
return Jwts.builder().addClaims(claims) // 要存储的数据
.setExpiration(new Date(System.currentTimeMillis() + jwtConfig.getExpiration())) // 过期时间
.signWith(SignatureAlgorithm.HS256, jwtConfig.getSecret()) // 加密算法和密钥
.compact(); // 打包返回 3部分
}
/**
* 校验Token是否合法
*
* @param token 要校验的Token
* @return
*/
public Claims parseJwtToken(String token) {
Claims claims = null;
claims = Jwts.parser().setSigningKey(jwtConfig.getSecret())// 根据哪个密钥解密
.parseClaimsJws(token) // 设置要解析的Token
.getBody();
return claims;
}
}
第四步编写拦截器
java
package com.example.demo.interceptor;
import com.example.demo.config.JwtConfig;
import com.example.demo.utils.JwtKit;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import io.jsonwebtoken.Claims;
/**
* 自定义拦截器,主要用于用户鉴权
*
* @author AdminMall
*
*/
@Component
public class AuthInterceptorHandler implements HandlerInterceptor {
@Autowired
private JwtConfig jwtConfig;
@Autowired
private JwtKit jwtKit;
/**
* 前置拦截器
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取到JWT的Token
String jwtToken = request.getHeader(jwtConfig.getTokenHeader());
if (jwtToken != null) {
// 截取中间payload部分
String payloadToken = jwtToken.substring(jwtConfig.getTokenHead().length());
// 解析Token,获取Claims = Map
Claims claims = jwtKit.parseJwtToken(payloadToken);
// 获取payload中的报文,
System.out.println("登陆人:" + claims.get("name").toString());
return true;
}
System.out.println("登陆非法");
return false;
}
}
第五步编写controller
java
package com.example.demo.controller;
import com.example.demo.utils.JwtKit;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.entity.User;
@RestController
@RequestMapping("/jwt")
public class JwtController {
@Autowired
private JwtKit jwtKit;
@GetMapping("/getJwtToken")
public String getJwtToken(HttpServletRequest request) {
User user = new User();
user.setName("王天一");
String token = jwtKit.generateToken(user);
return token;
}
@RequestMapping("/parseJwtToken")
public String parseJwtToken(HttpServletRequest request) {
return "解析成功";
}
}
第六步postman调用获取jwt

第七步验证token能不能解析成功

到这里就结束了一个简单的jwt的hello world