Python 官方文档:入门教程 => 点击学习
目录1.Jwt2.JWT登录执行流程图3.为什么使用JWT?4.JWT的组成5.SpringBoot整合JWT测试总结1.JWT JWT(JSON WEB Token),为了
JWT(JSON WEB Token),为了在网络应用环境间传递声明而执行的一种基于jsON的开放标准。将用户信息加密到token中,服务器不保存任何用户信息,服务器通过保存的密钥验证token的正确性。
优点
1.简介:可以通过 URL POST 参数或者在 Http header 发送,因为数据量小,传输速度也很快;
2.自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库;
3.因为 Token 是以 JSON 加密的形式保存在客户端的,所以 JWT 是跨语言的,原则上任何 web 形式都支持;
缺点
1.无法作废已经发布的令牌;
2.不易应对数据过期;
JWT由三部分构成,类似于如下:
eyJ0eXaiOiJKV1QiLCJhbGCiOiJIUzUxMiJ9.eyJzdWIiOiJscyIsImV4cCI6MTYyNDU5Nzc5Nn0.4kwT1elZCb_k2D7AxbuFHM35VmBK4PcmLaqHhcHEq4_wVe8GVO8ODypGSKksTs-hraBopBCm2IC9EC2rO-GHng
第一部分为头部(header),承载两部分信息
声明类型(JWT)
{
"typ","JWT",
"alg","HS256"
}
使用Base64加密后
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9
第二部分为payload(载荷),存放有效信息的地方,这些有效信息分为三部分:
其中,标准中注册的声明 (建议但不强制使用)包括如下几个部分 :
公共的声明部分:
公共的声明可以添加任何信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加铭感信息,因为在客户端可解密。
私有的声明部分:
私有的声明是提供者和消费者共同定义的声明,不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
第三部分为signature(签证)
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
//密钥就是我们定义的secret,加密后得到签证
var signature = HMACSHA256(encodedString, '密钥');
引入依赖
<!--JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
<!--StringUtils工具包-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--ConfigurationProperties出现异常-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
配置application.yml文件
server:
port: 8888
spring:
jwt:
#过期时间
expireTime: 1800000
#加密密钥
secret: lsyyp5201314
#token返回头部
header: LOGINTOKEN
JWT工具类
package org.best.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.alGorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Date;
@ConfigurationProperties(prefix = "spring.jwt")
public class JWTUtils {
public static String header;
private static String secret;
private static String expireTime;
public static String createToken(String sub){
return JWT
.create()
.withSubject(sub)
.withExpiresAt(new Date(System.currentTimeMillis()+Long.parseLong(expireTime)))
.sign(Algorithm.HMAC512(secret));
}
public static String validateToken(String token){
return JWT
.require(Algorithm.HMAC512(secret))
.build()
.verify(token)
.getSubject();
}
public static boolean refreshToken(String token) {
Date expireDate = null;
try {
expireDate = JWT
.require(Algorithm.HMAC512(secret))
.build()
.verify(token)
.getExpiresAt();
} catch (TokenExpiredException e) {
return true;
}
return (expireDate.getTime()-System.currentTimeMillis())<0;
}
public void setHeader(String header) {
this.header = header;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getExpireTime() {
return expireTime;
}
public void setExpireTime(String expireTime) {
this.expireTime = expireTime;
}
}
自定义拦截器
package org.best.config;
import org.apache.commons.lang.StringUtils;
import org.best.common.TokenIsNullException;
import org.best.common.TokenValidateException;
import org.best.util.JWTUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.httpservletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String logintoken = request.getHeader("LOGINTOKEN");
//如果token为空
if (StringUtils.isBlank(logintoken)){
throw new TokenIsNullException("请登录");
}
//校验Token
String sub = JWTUtils.validateToken(logintoken);
if (StringUtils.isBlank(sub)){
throw new TokenValidateException("token校验失败");
}
//更新token有效期(生产新token)
if (JWTUtils.refreshToken(logintoken)){
String token = JWTUtils.createToken(sub);
response.setHeader(JWTUtils.header,token);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
注册拦截器
package org.best.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorReGIStry;
import org.springframework.web.servlet.config.annotation.WebmvcConfigurer;
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(new LoginInterceptor())
.addPathPatterns("/find")
.excludePathPatterns("/login");
}
}
自定义异常
package org.best.common;
public class TokenValidateException extends RuntimeException {
public TokenValidateException() {
}
public TokenValidateException(String message) {
super(message);
}
}
package org.best.common;
public class TokenIsNullException extends RuntimeException{
public TokenIsNullException() {
}
public TokenIsNullException(String message) {
super(message);
}
}
自定义Controller
package org.best.controller;
import org.best.pojo.User;
import org.best.util.JWTUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
@RestController
public class LoginController {
@GetMapping("/login")
public String login(User user, HttpServletResponse response){
//这里就不做数据库查询了
//根据用户id生成token
String token = JWTUtils.createToken(String.valueOf(user.getId()));
//将token存入HTTP响应头中
response.setHeader(JWTUtils.header,token);
return user.toString();
}
@GetMapping("/find")
public String find(){
return "success";
}
}
登录接口
我们来测试下find 接口 ,不带token会出现啥情况
带上token
到此这篇关于SpringBoot整合JWT的文章就介绍到这了,更多相关SpringBoot整合JWT内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: SpringBoot整合JWT的入门指南
本文链接: https://www.lsjlt.com/news/129393.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0