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

相关推荐
码兄科技5 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研6 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe186 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_6 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff7 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯7 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地8 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123458 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
云和恩墨8 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr
万亿少女的梦1688 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue