SpringSecurity+JWT登录时遇见的问题

package com.bai.server.config.security;import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @author bai* @date 2023年02月19日 16:25*/
@Configuration
public class JwtTokenUtil {public static final String CLAIM_KEY_USERNAME = "sub";public static final String CLAIM_KEY_CREATED = "created";@Value("${jwt.secret}")//秘钥private String secret;@Value("${jwt.expiration}")//失效时间private Long expiration;/*** @param userDetails* @return generteToken* @author bai* @date 2023/2/19 0019 16:32* 根据用户名和时间创建token*/public String generteToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername());claims.put(CLAIM_KEY_CREATED, new Date());return generateToken(claims);}/*** @param token* @return java.lang.String* @author bai* @date 2023/2/19 0019 16:39* 从token中获取用户名*/public String getUserNameFromToken(String token) {String userName;try {Claims claims = getClaimsFromToken(token);//通过荷载claim就可以拿到用户名userName = claims.getSubject();} catch (Exception e) {throw new RuntimeException(e);}return userName;}/*** @param token* @param userDetails* @return boolean* @author bai* @date 2023/2/19 0019 16:47* 判断token是否有效*/public boolean validateToken(String token, UserDetails userDetails) {String name = getUserNameFromToken(token);return name.equals(userDetails.getUsername()) && !isTokenExpired(token);}/*** @param token* @return java.lang.String* @author bai* @date 2023/2/19 0019 16:59* 刷新token*/public String refreshToken(String token) {Claims claims = getClaimsFromToken(token);claims.put(CLAIM_KEY_CREATED, new Date());return generateToken(claims);}/*** @param token* @return boolean* @author bai* @date 16:57* 判断token是否可以刷新*/public boolean canRefresh(String token) {return !isTokenExpired(token);}/*** @param token* @return boolean* 判断token是否失效* @author bai* @date 2023/2/19 0019 16:51*/private boolean isTokenExpired(String token) {Date date = getExpriedDateFromToken(token);return date.before(new Date());}/*** @param token* @return java.util.Date* 从token中获取过期时间* @author bai* @date 2023/2/19 0019 16:53*/private Date getExpriedDateFromToken(String token) {Claims claims = getClaimsFromToken(token);return claims.getExpiration();}/*** @param token* @return io.jsonwebtoken.Claims* 从token中获取荷载* @author bai* @date 2023/2/19 0019 16:44*/private Claims getClaimsFromToken(String token) {Claims claims = null;try {claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();} catch (Exception e) {e.printStackTrace();}return claims;}/*** @param claims* @return java.lang.String* @author bai* @date 2023/2/19 0019 16:36* 根据荷载生成 jwt token*/private String generateToken(Map<String, Object> claims) {return Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()).signWith(SignatureAlgorithm.HS512, secret).compact();}/*** @return java.util.Date* @author bai* @date 2023/2/19 0019 16:37* 生成token失效时间*/private Date generateExpirationDate() {return new Date(System.currentTimeMillis() + expiration * 1000);}
}
package com.bai.server.config.security;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author bai* @date 2023年02月20日 19:09* JWT登录 授权过滤器*/public class JwtAuthencationTokenFilter extends OncePerRequestFilter {@Value("${jwt.tokenHeader}")private String tokenHeader;@Value("${jwt.tokenHead}")private String tokenHead;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {//通过request获取请求头String authHeader = httpServletRequest.getHeader(tokenHeader);//验证头部,不存在,或者不是以tokenHead:Bearer开头if (null != authHeader && authHeader.startsWith(tokenHead)) {//存在就做一个字符串截取,获取登录的tokenString authToken = authHeader.substring(tokenHead.length());//jwt根据token获取用户名String name = jwtTokenUtil.getUserNameFromToken(authToken);//token存在用户名但是未登录if ( !StringUtils.isEmpty(name) && null == SecurityContextHolder.getContext().getAuthentication()) {//登录UserDetails userDetails = userDetailsService.loadUserByUsername(name);//验证token是否有效,重新设置用户对象if (jwtTokenUtil.validateToken(tokenHead, userDetails)) {UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));SecurityContextHolder.getContext().setAuthentication(authenticationToken);}}}filterChain.doFilter(httpServletRequest, httpServletResponse);}
}

在线急等大佬解决

云E办:JWT strings must contain exactly 2 period characters. Found: 0相关推荐

  1. JWT strings must contain exactly 2 period characters. Found: 0(JWT字符串必须正好包含2个句点字符。找到:0)

    异常图片 1.通常是因为jwt的格式不对,复制的时候代码写死了,没有将程序及时更新 更正后: 2.是jwt的生成规则不对,导致验证jwt的时候通不过

  2. 云e办学习笔记(四)SpringSecurity学习(二)

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

  3. B站云E办Vue+SpringBoot前后端分离项目——MVC三层架构搭建后台项目

    本项目来源B站云E办,笔记整理了项目搭建的过程和涉及的知识点.对于学习来说,不是复制粘贴代码即可,要知其然知其所以然.希望我的笔记能为大家提供思路,也欢迎各位伙伴的指正. 项目前端学习笔记目录 B站云 ...

  4. 002云E办项目之登录模块

    如果你没有看第一篇文章,建议你去看一下 文章链接 好好看每一步 你可以知道什么是逆向工程 你可以在这里好好学习一下登录模块 由于本的sql语句放在001云E办项目创建 一. 逆向工程(创建AutoGe ...

  5. 云e办学习笔记(七)登录返回token(未完全)

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

  6. 云e办学习笔记(十五)Redis学习以及相关部署

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

  7. 云e办(后端)——项目介绍及搭载项目

    云e办 项目介绍 本项目目的是实现中小型企业的在线办公系统,云E办在线办公系统是一个用来管理日常的办公事务的一个系统,他能够管的内容有:日常的各种流程审批,新闻,通知,公告,文件信息,财务,人事,费用 ...

  8. 云e办学习笔记(十六)Redis集成菜单

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

  9. 云e办学习笔记(三十三)FastDFS学习和安装

    前言 本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录.云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7T ...

最新文章

  1. java新建常量_【Java】常量 - 每日坚果的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. LeetCode 2166. 设计位集(Bitset)
  3. C/C++程序设计注意事项 (二)
  4. Eclipse开启或取消快速导航栏(toggle breadcrumb)
  5. PHP------- 继承
  6. java spring 事务传播_深入理解Spring的事务传播行为
  7. 大型论坛系统环境搭建(20万日IP负载平衡实战)–Nginx+Apache2+PHP+MySQL
  8. SwiftUI 生命周期onAppear,onDisappear
  9. stc15f2k60f2单片机定时器_STC15F2K60S2系列
  10. Linux无头浏览器的自动化测试实现
  11. 运维简历怎么写项目描述_实习的简历应该怎么写?
  12. 最新的中国风歌曲——《颜如玉》
  13. Java爬堆糖图片爬虫
  14. mysql自定义函数的分号_Mysql自定义函数
  15. 异常 illegal character 200B
  16. 百度天气API 获取天气
  17. Milk Measurement
  18. canoe的下载安装【亲测】
  19. JAVA的pdf转图片方法
  20. java 调用火狐内核_[图文]自己动手做J浏览器——基于JAVA和火狐内核(gecko)

热门文章

  1. unity实现HTTP请求
  2. php环境安装使用方法,如何一键安装PHP环境(适合新手使用)
  3. 第八章 用QImage高质量绘图
  4. figma都有哪些优势,哪些特点让你选择了figma
  5. python-Threading多线程之线程锁
  6. 万能地图下载器在导出图片时如何叠加标注信息
  7. 中国网络社区15年发展历程
  8. elasticsearch预加载数据到文件系统缓存
  9. 除了观察者还有什么人格
  10. 华为OD机试 -Excel 单元格数值统计(Python) | 机试题+算法思路+考点+代码解析 【2023】