JavaEE——Spring Boot + jwt

server/2024/10/20 9:53:20/

目录

什么是Spring Boot + jwt?

如何实现Spring Boot + jwt:

1. 添加依赖

2、创建JWT工具类

3. 定义认证逻辑

4. 添加过滤器

 5、 http请求测试


什么是Spring Boot + jwt?

Spring Boot和JWT(JSON Web Token)是一对常见的组合,用于构建安全的Web应用程序。下面是它们的主要功能和如何结合使用的概览:

  1. Spring Boot:Spring Boot是一个用于快速构建基于Spring框架的Java应用程序的工具。它通过提供默认配置和约定大于配置的方式,简化了Spring应用程序的开发过程。

  2. JWT(JSON Web Token):JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT通常用于身份验证和信息传输,在Web应用程序中广泛应用。

如何实现Spring Boot + jwt:

1. 添加依赖

① 在你的 Spring Boot 项目中添加 JWT 相关的依赖,比如 jjwt 库,以便于创建和验证 JWT。

java">       <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

② 确保mybatis、mysql、spring boot、redis、druid、lombok等相关依赖存在

③ maven 刷新下载依赖

2、创建JWT工具类

① 编写一个工具类来处理 JWT 的创建、解析和验证。这个类通常包含以下方法: - 创建 JWT:将用户信息(例如用户名、角色等)加密生成一个 token。

java">    public static String getToken(Map<String, Object> claims) {// JWT的签发时间long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);// 指定签名的时候使用的签名算法SignatureAlgorithm signatureAlgotithm = SignatureAlgorithm.HS256;long expMillis = nowMillis + 604800000L;        // 默认设置7天过期Date expirationDate = new Date(expMillis);String token = Jwts.builder()               // 创建jwt builder.setClaims(claims)                      // 必须放最前面,不然后面设置的东西都会没有:如setExpiration会没有时间.setId(UUID.randomUUID().toString())     // jwt唯一标识.setIssuedAt(now)                                    // 签发时间.setExpiration(expirationDate)                 // 过期时间.signWith(signatureAlgotithm, key)          // 设置签名实用的签名算法和使用的密钥.compact();return token;}

 ② 编写一个工具类来处理 JWT 的创建、解析和验证。这个类通常包含以下方法: - 解析 JWT:从收到的 token 中提取用户信息

java">  public static Claims parseJwt(String token) throws Exception {String msg = null;try{Claims claims = Jwts.parser().setAllowedClockSkewSeconds(604800) // 允许7天的偏移.setSigningKey(key)                         // 设置签名密钥.parseClaimsJws(token).getBody(); // 设置需要解析的JWTreturn claims;}catch (SignatureException se) {msg = "密钥错误";log.error(msg, se);throw new RuntimeException(msg);}catch (MalformedJwtException me) {msg = "密钥算法或者密钥转换错误";log.error(msg, me);throw new RuntimeException(msg);}
catch (MissingClaimException mce) {msg = "密钥缺少校验数据";log.error(msg, mce);throw new RuntimeException(msg);}catch (ExpiredJwtException mce) {msg = "密钥已过期";log.error(msg, mce);throw new RuntimeException(msg);}catch (JwtException jwte) {msg = "密钥解析错误";log.error(msg, jwte);throw new RuntimeException(msg);}}

3. 定义认证逻辑

① 在 controller 中,添加 @Slf4j 注解用于日志记录

② 在 controller 中,创建一个 login方法用来控制用户登入

java"> @PostMapping("/login")public Map<String, Object> login(@RequestBody User user) {log.info("user",user);log.info("用户名: [{}]", user.getName());log.info("密码: [{}]", user.getPwd());User u = userService.login(user);}

③ 在 login中 创新一个Map对象,承载认证结果和相关信息

java">Map<String, Object> map = new HashMap<>();

④ 如果用户认证成功(u != null),则创建一个包含用户ID和名称的Map对象,并生成一个JWT令牌。接着在响应map中设置状态为true,消息为“认证成功”,并包含了生成的令牌。

⑤ 如果认证失败(u为空),则在响应map中设置状态为false,并包含了一个指示“用户名或者密码错误”的消息。 

java">try {if (u != null) {Map<String, Object> payLoad = new HashMap<>();payLoad.put("id", u.getId());payLoad.put("name", user.getName());String token = JWTUtils.getToken(payLoad);map.put("state", true);map.put("message", "认证成功");map.put("token",token);} else {map.put("state", false);map.put("message", "用户名或者密码错误");}} catch (Exception e) {map.put("state", false);map.put("msg", e.getMessage());}return map;

4. 添加过滤器

① 创建一个JWTInterceptor过滤器文件来检查传入的请求是否携带有效的 token,并根据需要进行相应的处理

java">public class JWTInterceptor implements HandlerInterceptor {

 ② 创建preHandle方法,在请求处理之前执行,用于检查传入的请求是否携带有效的 token,并解析令牌

java">@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String, Object> map = new HashMap<>();// 获取请求头中令牌String token = request.getHeader("token");if(!StringUtils.isEmpty(token)) {              try {Claims claims = JWTUtils.parseJwt(token); // 如果找到令牌就使用 JWTUtils.parseJwt() 方法解析令牌return true;                                     // 解析成功,即令牌有效,返回true} catch (RuntimeException e) {          // 如果解析失败,会捕获 RuntimeException 异常e.printStackTrace();map.put("msg", e.getMessage());  // map.put("msg","密钥错误!");}}

③ 将异常信息放入 map 中,并设置一些响应信息,然后将信息以 JSON 格式返回给客户端

java">        map.put("message","token为null,必须携带token");map.put("state",false);             // 设置状态// 将map 转为 json  jacksonString json = new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);return false;}
}

④ 再添加一个拦截器配置类 InterceptorConfig,用于配置和注册拦截器到 Spring MVC 中

java">@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {String[] patterns = new String[] {"/auth/login","/*.html","/css/**","/js/**","/images/**","/layui/**"};    // 添加不拦截的方法registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/**")         // 其他接口token验证.excludePathPatterns(patterns);  // 不进行token验证}
}

 5、 http请求测试

 


http://www.ppmy.cn/server/18148.html

相关文章

【Ajax-异步刷新技术】什么是Ajax之续章 !

文章目录 Ajax第五章1、layui的后台布局2、layui的数据表格1、在jsp页面中编写table2、在页面中引入文件3、编写代码4、参照文档修改表格属性 **3、最终效果** 第六章1、继续第五章内容1、layui组件2、添加数据3、查看数据4、修改数据5、删除数据 2、批量删除核心 3、数据表格重…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器&#xff0c;在item中添加了很多的控件&#xff0c;这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候&#xff0c;及容易不小心就把数据给修改了而不自知。所有&#xff0c;我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

2014NOIP普及组真题 1. 珠心算测验

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1965 核心思想&#xff1a; 1、题目所求为“有多少个数其他两个数之和”&#xff0c;故不管5是由14组成&#xff0c;还是23组成&#xff0c;都只算一次。 2、利用 set 有 自动去重 的功…

【U+】U+智享版运维平台账号密码重置

【问题描述】 友加畅捷系列中的U智享版软件&#xff0c; 系统运维平台账号admin密码忘记了&#xff0c;无法登录。 【解决方法】 在软件的安装目录下&#xff0c;找到sysconfig_accounts文件&#xff0c;并删除。 【路径&#xff1a;X:\U系列软件\U智享版\WebSite\config\】 …

electron中preload.js文件的用法

在Electron中&#xff0c;preload.js文件扮演着非常重要的角色&#xff0c;它允许你在渲染进程中的全局作用域里安全地、有选择地集成Node.js和Electron的API。这是一种在保持渲染进程与主进程隔离的同时&#xff0c;又能使渲染进程具有访问特定Electron API的能力的方法。这种…

QT C++(信号与槽函数,自定义信号和槽函数)

文章目录 1. QT信号与槽函数2. QT自定义信号和槽函数 1. QT信号与槽函数 QT信号关键要素&#xff1a; 信号源&#xff1a;那个控件发送的信号信号类型&#xff1a;用户进行不同的操作&#xff0c;就可能触发不同的信号。 eg&#xff1a;点击按钮&#xff0c;移动鼠标等信号处…

基于 SpringCloud 的在线交易平台商城的设计与实现

摘 要 随着互联网的快速发展&#xff0c;人们对商品经济的消费和思考不再停留在传统 的经济模式上&#xff0c;网上购物商城是企业与企业进行、企业与消费者进行电子商 务交易的一个很好平台。网上购物商城极大地降低了企业商家的交易成本&#xff0c; 缩短企业供应链周期&…

layabox手游全面屏、ipad屏幕适配方案

1设置 手游平台在项目设置中&#xff0c;场景适配模式选择”固定宽模式 fixedwidth“&#xff0c;设计宽度以全面屏比例为主&#xff0c;我这里设置的设计宽高为640 * 1386 2代码和场景 laya的UI面板有三种类型&#xff0c;分别是Scene、View和Dialog 1&#xff09;Scene和V…