jwt生产token,简单版helloworld

第一步添加依赖

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

相关推荐
lsc_blog26 分钟前
年终自评别贴提交记录,把技术产出讲成变化
数据库·面试·职场和发展·跳槽·求职招聘
2601_962106645 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice6 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106646 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
杨凯凡7 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard7 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android7 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤8 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Zan8 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶9 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范