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

相关推荐
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 13 章 MCP 客户端:传输、工具聚合与命名冲突
java·人工智能·开源