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

相关推荐
云烟成雨TD1 天前
Spring AI 1.x 系列【61】Spring AI 2.0 升级指南
java·人工智能·spring
数据库小学妹1 天前
SQL Server数据库同步工具怎么选?6款方案对比+信创迁移避坑清单
数据库·经验分享·sqlserver·dba
不剪发的Tony老师1 天前
国产数据库之GaussDB:固若金汤
数据库·gaussdb
lulu12165440781 天前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
雨辰AI1 天前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
(Charon)1 天前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫1 天前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
基德爆肝c语言1 天前
MySQL表的操作
前端·数据库·mysql
TDengine (老段)1 天前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据