day13 SpringBoot案例3 令牌技术、登录校验

article/2025/10/16 17:49:46

登录校验的实现思路是怎样的?

项目中访问核心资源,通常都要进行登录校验,访问京东商城的订单,必须要先登录才能访问查询

实现思路: 可以在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登录拒绝访问。如果是登录的那就可以进行访问资源。

  • 用户输入用户名和密码提交登录请求。
  • 服务器接收登录请求并验证用户名和密码的合法性。
  • 如果用户名和密码合法,服务器生成一个会话(Session)并将用户的身份信息保存在会话中。(SpringBoot的web环境中,我们要想获取Session会话对象,直接就可以在Controller方法的形参中声明)( public Result login(@RequestBody Emp emp, HttpSession session))
  • 服务器将会话ID返回给客户端,通常是通过在浏览器的Cookie中设置会话ID。
  • 客户端在后续的请求中将会话ID附加在请求的头部或参数中发送给服务器。
  • 服务器接收到请求后,从请求中获取会话ID,并根据会话ID查找对应的会话信息。
  • 如果会话存在且有效,服务器认为用户已登录,并继续处理请求;如果会话不存在或已过期,服务器返回错误信息,要求用户重新登录。
  • 在用户退出登录或会话过期时,服务器会删除对应的会话信息,客户端需要重新进行登录验证。

会话技术有哪些方式可以实现?

传统技术可以使用cookie+Session去实现会话,进行会话跟踪。但是这种传统方式有弊端: 不能在集群服务中灵活使用,手机客户端无法支持cookie。
为了解决这些问题,可以使用令牌技术来解决。令牌技术优点是:可以在集群服务中灵活使用,移动端也可以支持。

1,Cookie:Cookie存储会话信息,服务器在响应中设置一个包含会话ID的Cookie,客户端在后续的请求中将会话ID通过Cookie发送给服务器。服务器根据会话ID查找对应的会话信息。Cookie的优点是简单易用,但存在一些安全性和跨域限制。

2,Session:使用Token来实现无状态的会话管理。服务器在登录成功后生成一个Token,并将Token返回给客户端。客户端在后续的请求中将Token附加在请求的头部或参数中发送给服务器。服务器根据Token来验证用户身份和权限。Token的优点是无状态、可扩展性强,适用于分布式系统。

  • 服务端集群环境下Session的共享问题。
  • 移动端APP端无法使用Cookie。

 令牌技术

  • 使用 json 作为数据传输,有广泛的通用型,并且体积小,便于传输;
  • 优点:可以实现无状态的会话管理,服务器不需要存储会话信息,从而提高系统的可扩展性和性能。同时,令牌可以灵活地应用于不同的客户端,如Web应用、移动应用等。

JWT令牌组成部分有哪些,各自作用是什么?

三部分组成:header.payload.signature 部分的数据会以Base64的方式进行编译
第一部分:Header(头),作用:记录令牌类型、签名算法等

第二部分:Payload(有效载荷),作用:携带一些用户信息及过期时间等

第三部分:Signature(签名),作用:防止Token被篡改、确保安全性

 

怎么使用JWT令牌?(依赖,创建,校验)

1,pom.xml 引入jwt的依赖

2,创建令牌

 引入JWT工具类


 登录完成后,调用工具类生成JWT令牌并返回

效验

项目中在什么时候去生成令牌?

在登录时生成JWT令牌,在访问核心资源的时候进行令牌效验

当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?

过滤器Filter、拦截器Interceptor。

  • 在后端中,实现一个拦截器,用于拦截所有需要进行令牌校验的请求。
  • 在拦截器中,获取请求中的令牌(从请求头部、参数或Cookie中获取)。
  • 对获取到的令牌进行解密效验,确保令牌的完整性和真实性。
  • 如果令牌验证通过,将解密后的令牌中的用户身份信息(如用户ID、角色等)存储在请求对象中,以便后续的处理逻辑使用。
  • 如果令牌验证不通过,可以返回错误信息或重定向到登录页面,要求用户重新进行身份验证。

过滤器具体使用的步骤是怎样的?

  • 获取请求url(路径)。
  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
  • 如果不包含login,获取请求头中的令牌(token)。
  • 判断token是否存在,如果不存在,返回错误结果(未登录)。
  • (存在)  解析token,如果解析失败,返回错误结果(未登录)。
  • 解析成功则放行。

1,引入json数据处理的依赖.

2,定义登录校验过滤器类,实现 Filter接口,并重写doFilter方法

3,配置Filter拦截资源的路径:在类上定义 @WebFilter (urlPatterns = "/*")注解

4,在引导类上使用@ServletComponentScan 开启 Servlet  组件扫描

拦截器具体使用的步骤是怎样的?

  1. 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
  2. 注册拦截器,实现WebMvcConfigurer接口,重写addInterceptor方法

项目中异常是怎么处理的?具体怎么实现?

抛出异常:直接抛出异常,然后在Controller的方法中进行try…catch捕获处理

全局异常处理器:

任务:把登录校验功能实现完善,并集成全局异常处理

SpringMVC中提供了全局异常处理器接收所有Controller中产生的异常。一般定义在exception包下:

@RestControllerAdvice = @ControllerAdvice  + @ResponseBody

Filter 与 Interceptor 区别?

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

  拦截器的拦截路径怎样设置?

      过滤器Filter:

 登录校验过滤器

@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;String url = request.getRequestURL().toString();//如果是login, 直接放行if(url.contains("login")){System.out.println("登录操作, 直接放行...");filterChain.doFilter(req, res);return;}//如果不是 login ,需要校验 tokenString token = request.getHeader("token");if(!StringUtils.hasLength(token)){ //如果没有JWT令牌System.out.println("获取到token为空 , 返回错误信息...");//返回 未登录 提示信息String result = JSONObject.toJSONString(Result.error("NOT_LOGIN"));//response.setContentType("application/json;charset=utf-8");response.getWriter().write(result);return ;}//解析jwt令牌, 如果解析失败, 则说明令牌无效 , 返回 未登录 提示信息try {JwtUtils.parseJWT(token);System.out.println("令牌解析成功, 直接放行 ...");} catch (Exception e) {e.printStackTrace();System.out.println("令牌解析失败 , 返回错误信息...");//返回 未登录 提示信息String result = JSONObject.toJSONString(Result.error("NOT_LOGIN"));// response.setContentType("application/json;charset=utf-8");response.getWriter().write(result);return ;}//如果校验通过放行filterChain.doFilter(req, res);}}

拦截器:Interceptor

定义拦截器:
//@Component
public class LoginCheckInterceptor implements HandlerInterceptor {//目标资源方法执行前执行 , true : 放行 ; false : 不放行,拦截 ;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String url = request.getRequestURL().toString();//如果是login, 直接放行if(url.contains("login")){System.out.println("登录操作, 直接放行...");return true;}//如果不是 login ,需要校验 tokenString token = request.getHeader("token");if(!StringUtils.hasLength(token)){ //如果没有JWT令牌System.out.println("获取到token为空 , 返回错误信息...");//返回 未登录 提示信息String result = JSONObject.toJSONString(Result.error("NOT_LOGIN"));//response.setContentType("application/json;charset=utf-8");response.getWriter().write(result);return false;}//解析jwt令牌, 如果解析失败, 则说明令牌无效 , 返回 未登录 提示信息try {JwtUtils.parseJWT(token);System.out.println("令牌解析成功, 直接放行 ...");} catch (Exception e) {e.printStackTrace();System.out.println("令牌解析失败 , 返回错误信息...");//返回 未登录 提示信息String result = JSONObject.toJSONString(Result.error("NOT_LOGIN"));response.setContentType("application/json;charset=utf-8");response.getWriter().write(result);return false;}//如果校验通过放行return true;}//目标资源方法执行后执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle ....");}//请求处理完成后调用@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion ....");}}
注册拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}

JWT令牌工具类:

JWT工具类
public class JwtUtils {private static String signKey = "itheima";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}


http://chatgpt.dhexx.cn/article/dZ9k2mUi.shtml

相关文章

pythonjson数据解析失败_json解析失败是什么意思

因为代码的不美观等因素&#xff0c;我们会使用一些解析工具进行处理&#xff0c;有些人在解析时出现了报错。解析失败需要考虑多方面的因素&#xff0c;如格式、String类型、boolean类型等原因&#xff0c;在格式上分为格式错误和格式正确两种讨论。下面就json解析失败的原因为…

Java Web Token令牌校验

前言&#xff1a;本文只涉及JWT的理论部分&#xff0c;不涉及代码 传统的用户校验可以结合cookiesession来实现&#xff0c;但是校验信息存放在服务端&#xff0c;当用户过多时会给服务器造成太大的压力&#xff0c;所以我们可以使用token进行校验&#xff0c;将用户信息加以签…

JWT令牌生成与校验

目录 1 JWT介绍1.1 什么是JWT&#xff1f;1.2 JWT令牌结构 2 配置JWT令牌服务3 生成JWT令牌4 校验JWT令牌5 JWT整合Spring Security5.1 创建表 6 配置授权服务6.1 测试 1 JWT介绍 通过上边的测试我们发现&#xff0c;当资源服务和授权服务不在一起时资源服务使用RemoteTokenSe…

信息系统基础知识(笔记)

一、信息 1.1、信息的基本概念 信息就是信息&#xff0c;既不是物质们也不是论量&#xff0c;信息是能够用来消除不确定的东西 两个概念层次&#xff1a;本体论&#xff08;客观层&#xff0c;与课客体本身因素相关&#xff0c;与主题因素无关&#xff09; 认知论&#xff0…

计算机毕业论文内容参考|基于大数据的信息物理融合系统的分析与设计方法

文章目录 导文摘要前言绪论课题背景国内外现状与趋势:课题内容:相关技术与方法介绍:系统架构设计:数据采集与处理:数据存储与管理:数据分析与挖掘:系统优化与调试:应用场景:挑战与机遇:研究方向:系统分析:系统设计:系统实现:系统测试:总结与展望:

工业4.0中的人-信息-物理系统集成(HSI):设计与评估方法

于栖洋 译 摘要:本文概述了工业4.0中集成人和信息物理系统的设计和使用空间&#xff0c;特别关注分析、设计和评估方法和阶段的相互作用。本文首先介绍了工业4.0面临的挑战&#xff0c;综述了现有的系统设计方法&#xff0c;描述了方法模型的设计和使用空间&#xff0c;并以工…

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中&#xff0c;将培育人工智能、移动智能终端…

Unity物理系统(一)物理系统相关组件

一、物理系统相关组件 Unity中的物理系统涉及的组件分为如下几类&#xff1a; 刚体角色控制器碰撞体布料关节力场 二、刚体&#xff08;Rigidbody&#xff09; Rigidbody&#xff08;刚体&#xff09;组件可以使游戏对象在物理系统的控制下进行运动&#xff0c;Rigidbody …

工业信息物理系统测试验证平台(ETest_CPS)

1.产品简介 ETest_CPS是基于ETest Studio开发出的工业信息物理系统测试验证平台&#xff08;Embedded System Test Studiofor Cyber-Physical System,简称&#xff1a;ETest_CPS&#xff09;。ETest_CPS由软件和硬件组成&#xff0c;软件采用ETest&#xff0c;硬件包括测试机柜…

信息化与信息系统5

信息系统规划 大型信息系统的特点 考点&#xff1a; 具体包括以下6点&#xff1a; 规模庞大&#xff0c;跨地域性&#xff0c;网络结构复杂&#xff0c;业务种类多&#xff0c;数量大&#xff0c;用户多。 信息系统规划方法 规划流程 1. 分析企业信息化的现状 2. 制定企…

信息物理社会融合系统:一种以数据为中心的框架

信息物理社会融合系统&#xff1a;一种以数据为中心的框架 翟书颖1, 郭斌2, 李茹1, 王庭良1, 於志文2, 周兴社2 1. 西北工业大学明德学院&#xff0c;陕西 西安 710129 2. 西北工业大学计算机学院&#xff0c;陕西 西安 710129 摘要&#xff1a;信息物理社会融合系统连接信息空…

ETest_CPS——工业信息物理系统测试验证平台

1&#xff09;产品简介 ETest_CPS是一款工业信息物理系统测试验证平台&#xff08;Embedded System Test Studio for Cyber-Physical System,简称&#xff1a;ETest_CPS&#xff09;。ETest_CPS由软件和硬件组成&#xff0c;软件采用ETest&#xff0c;硬件包括测试机柜、测试主…

信息物理系统-Rijndael加密算法的实现

信息物理系统-Rijndael加密算法的实现&#xff1a; 概述&#xff1a; AES标准的Rijndael算法是一种分组加密算法&#xff0c;本次实验通过PtolemyII软件&#xff0c;实现了明文长度为128位&#xff0c;密钥长度为128位的Rijndael加密算法。 实验的完成采取自底向上的&#x…

信息化与信息系统4

信息安全概念 安全分层 信息安全分为4层&#xff1a;设备安全&#xff0c;数据安全&#xff0c;内容安全&#xff0c;行为安全 会给出某些特性&#xff0c;要求反向选择是属于哪一层。 信息系统的安全保护等级 第一级&#xff1a;对个人&#xff0c;公司造成损害 第二级&a…

物理系统(一)

物理系统主要由以下几部分组成&#xff1a;Rigidbody&#xff08;刚体&#xff09;、Character Controller&#xff08;角色控制器&#xff09;、Collider&#xff08;碰撞器&#xff09;、Cloth&#xff08;布料&#xff09;、Joint&#xff08;关节&#xff09; 如图&#xf…

计算机信息系统

一、概念 &#xff08;1&#xff09; 计算机信息系统&#xff08; Computer_based Information System &#xff0c;简称信息系统&#xff09;是一类以提供信息服务 为主要目的的数据密集型、人机交互的计算机应用系统。 &#xff08;2&#xff09;由计算机及其相关的和配套的…

物理服务器的信息,信息物理系统

信息物理系统(CPS,Cyber-Physical Systems)是一个综合计算、网络和物理环境的多维复杂系统&#xff0c;通过3C(Computation、Communication、Control)技术的有机融合与深度协作&#xff0c;实现大型工程系统的实时感知、动态控制和信息服务。CPS实现计算、通信与物理系统的一体…

小白聊智慧制造:一文读懂信息物理系统(CPS)

随着我国“中国制造2025”的不断深入&#xff0c;越来越多的制造业企业在探索中国的制造业升级。制造业的智能升级有美国的工业互联网和德国的工业4.0两种方式&#xff0c;根据我国制造业所处的阶段&#xff0c;大多数企业选择德国工业4.0的方案。工业4.0的方案之中&#xff0c…

软考 - 05 信息物理系统(Cyber Physical Systems, CPS)

文章目录 题目【问题1】【答案1】【问题2】【答案2】【问题3】【答案3】 题目 信息物理系统&#xff08;Cyber Physical Systems, CPS)技术己成为未来宇航装备发展的重点关键技术之一。某公司长期从事嵌入式系统的研制工作&#xff0c;随着公司业务范围不断扩展&#xff0c;公…

LFU 的设计与实现

LFU 的设计与实现 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;LFU 的设计与实现 CSDN&#xff1a;LFU 的设计与实现 题目描述 LFU&#xff08;least frequently used&#xff09;。即最不经常使用页置换算法。 题目链接&#xff1a;LeetCode 460. LF…