登录校验总览-jwt令牌

一、前置问题

为什么要登录校验?登录校验,就是判断访问资源的用户是否是合法用户,保障安全。如果不设置登录校验,就可以跳过登录,直接通过url访问资源。

二、登录校验实现思路:

在服务器端对请求进行统一拦截。浏览器先请求登录接口,登录请求不拦截,登录成
功后,生成一个登录标记,以后每次请求都携带这个登录标记,在服务器端对每次请
求都拦截来校验登录标记,登录标记校验通过,放行请求。

在这里插入图片描述

三、会话技术

为什么学习会话技术?

在上边的内容中我们知道,需要每次请求都携带登录成功后生成的**登录标识**,
但是,浏览器和服务器之间的通信是http请求,http请求是无状态的,两次请
求之间是独立的,无法携带上次请求的数据,但是效率比较高。所以 ,会话
技术就是解决多次请求间共享数据的问题的。

1、会话

浏览器和服务器建立连接,就是会话,直到一方断开,会话结束,一次会话包含多次的请求和响应。如图①②③是一次会话中的多次请求和响应。

在这里插入图片描述

2、会话跟踪

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一会话,以便在同一会话的多次请求中共享数据。如图:①②③是一次会话,⑤是另一次会话

在这里插入图片描述

3、会话跟踪方案

(1)、客户端会话跟踪技术:cookie
①在登录接口生成cookie,服务器会自动的将cookie返回并保存到客户端浏览器,浏览器再次发送请求的时候也会自动的带上cookie。因为cookie是http协议支持的,所以是自动的。
②cookie可以存储key-value值,并以此在服务器端进行校验。
③在http的请求头中,是Cookie字段,在响应头中,是Set-Cookie字段。
④response.addCookie()中可以放置多个Cookie

在这里插入图片描述 在这里插入图片描述

优缺点:cookie优点:http协议中支持的技术缺点:移动端app无法使用用户可以自己禁用cookie不能跨域(协议、IP地址、端口号有一个不同就是跨域)
(2)、服务端会话跟踪技术:session
①session的使用需要依赖cookie,客户端浏览器访问服务器端,服务
器端生成一个session并保存到服务器端,将sessionId通过cookie返
回给浏览器,浏览器存储sessionId,在以后的每次请求中都会携带
sessionId到服务器端来找对应的session。
②服务器端向浏览器端响应sessionId是在Set-Cookie字段中存储,浏
览器向服务端发送请求,sessionId由Cookie携带。
③服务器端使用sessionId寻找session的过程是自动的

在这里插入图片描述在这里插入图片描述

优缺点:优点:存储在服务器端,安全缺点:①服务器集群环境下无法直接使用session(因为session存在服务器端,服务器集群下服务器A没有服务器B中的session)②cookie的缺点
(3)、令牌技术

在这里插入图片描述

实现思路:用户登录成功后,生成一个身份标识返回给浏览器,这个身份标识
存储在浏览器中,可以是cookie,也可存储在其他的字段中。等到浏览器向
服务器发送请求时,对请求进行拦截,校验身份标识,校验通过了,说明是
已经登录了,校验不通过,说明还没登录。优缺点:优点:支持pc端,移动端、解决集群环境下的认证问题、减轻服务器的存储压力缺点:需要自己实现(前后端配合)

四、 jwt令牌

1、是什么?

在这里插入图片描述

①jwt字符串的第一部分和第二部分是Base64编码方式,不是加密方式。第三部分是由第一部分指定的签名算法等信息计算而来。
②jwt令牌字符串中的字符只要有一位被篡改了,就校验不通过,很安全。

2、应用场景

在这里插入图片描述

3、jwt生成

(1)、引入jwt依赖

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

(2)、调用工具类生成、解析令牌

public class JwtTest {/*** 生成jwt令牌* */@Testpublic void getJwt(){HashMap<String, Object> claims = new HashMap<>();claims.put("id","1");claims.put("name","老白");String jwt = Jwts.builder() //Jwts是jwt依赖包提供的工具类,直接调用.signWith(SignatureAlgorithm.HS256, "abcd")//加密方式,密钥(长度大于3个字符).setClaims(claims)//载荷数据(自定义的内容).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//令牌有效期.compact();System.out.println(jwt);}/*** 解析jwt令牌* */@Testpublic void parseJwt(){Claims abcd = Jwts.parser().setSigningKey("abcd")//指定签名密钥.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6ICB55m9IiwiaWQiOiIxIiwiZXhwIjoxNzE0NDY2ODUxfQ.V1_NcMoICcEJ7HkFNmB-DIZxzx29xa6KqZoBAd5GciA").getBody();//获取令牌中的载荷System.out.println(abcd);}
}
注意事项:
①jwt校验时使用的签名密钥必要和生成jwt令牌时使用的密钥是相同的
②如果jwt解析校验报错,说明jwt被篡改或失效了,令牌非法。

4、登录后下发令牌

场景:登录成功后生成令牌并返回给前端,前端将jwt令牌放入token中

在这里插入图片描述
在这里插入图片描述postman测试结果:
在这里插入图片描述

	现在有了登录后生成jwt令牌,下边就需要拦截请求,对请求携带的jwt令牌进行校验。可以使用Filter(过滤器)或Interceptor(拦截器)对请求进行过滤。

三、过滤器Filter

1、快速入门

在这里插入图片描述在这里插入图片描述

2、详解(执行流程、拦截路径、过滤器链)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、登录校验-Filter

在这里插入图片描述

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter  implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req= (HttpServletRequest) servletRequest;HttpServletResponse resp= (HttpServletResponse) servletResponse;/*1、获取访问路径*/String url = req.getRequestURL().toString();/*2、判断url中是否包含login,如何包含,说明是登录接口,放行*/if(url.contains("login")){filterChain.doFilter(servletRequest,servletResponse);return;}/*3、获取请求头中的令牌(token)*/String jwt = req.getHeader("token");/*4、判断令牌是否存在,如果未存在,返回错误数据*/if(!StringUtils.hasLength(jwt)){Result error= Result.error("Not_Login");//将error转换为json,因为这不是controller,所以需要手动将error转为json数据返回前端String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}/*5、解析token,如果解析失败,返回错误结果(未登录)*/try {JwtUtil.parseJWT(jwt);}catch (Exception e){Result error= Result.error("Not_Login");//将error转换为json,因为这不是controller,所以需要手动将error转为json数据返回前端String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}/*6、放行*/filterChain.doFilter(servletRequest,servletResponse);}
}

四、拦截器 interceptor

1、快速入门

在这里插入图片描述在这里插入图片描述

2、详解(拦截路径、执行流程)

在这里插入图片描述在这里插入图片描述

执行流程:浏览器发送请求后,filter先进行拦截,顺序执行“放行前逻辑”、“放行”,
放行后请求进入spring的环境中,访问Controller,但是tomcat无法直接识
别Controller,tomcat是servlet程序,所以spring提供了DispatcherServlet
组件,由该组件将请求发送到Controller中,在这之间由拦截器拦截,先执行
preHandle方法,然后访问Controller,执行完成后再回到拦截器执行postHandle
、afterCompletion方法,最后再回到过滤器执行放行后的逻辑。

3、登录校验

在这里插入图片描述

//定义拦截器
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//访问的目标方法执行前执行  返回true:放行  false:不放行public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {/*1、获取访问路径*/String url = req.getRequestURL().toString();/*2、判断url中是否包含login,如何包含,说明是登录接口,放行*/if(url.contains("login")){log.info("登录操作,放行");return true;}/*3、获取请求头中的令牌(token)*/String jwt = req.getHeader("token");/*4、判断令牌是否存在,如果未存在,返回错误数据*/if(!StringUtils.hasLength(jwt)){Result error= Result.error("Not_Login");//将error转换为json,因为这不是controller,所以需要手动将error转为json数据返回前端String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return false;}/*5、解析token,如果解析失败,返回错误结果(未登录)*/try {JwtUtil.parseJWT(jwt);}catch (Exception e){Result error= Result.error("Not_Login");//将error转换为json,因为这不是controller,所以需要手动将error转为json数据返回前端String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return false;}/*6、放行*/return true;}@Override//目标方法执行后执行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle执行了");}@Override//视图渲染完后执行,最后执行的public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion执行了");}
}
//注册配置拦截器
@Configuration
public class LoginCheckConfiguration implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");//excludePathPatterns("/login")可以不要,因为在拦截器中也对登录请求进行了过滤}
}

以上内容学自“黑马程序员”公开课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

NVIDIA: RULER新测量方法让大模型现形

1 引言 最近在人工智能系统工程和语言模型设计方面的进展已经实现了语言模型上下文长度的高效扩展。以前的工作通常采用合成任务,如密钥检索和大海捞针来评估长上下文语言模型(LMs)。然而,这些评估在不同工作中使用不一致,仅揭示了检索能力,无法衡量其他形式的长上下文理解。 …

如何提高日语听力?日语学习日语培训柯桥小语种学校

每次一说起练日语听力&#xff0c;总离不开一个词&#xff0c;那就是“磨耳朵”。 可是&#xff0c;“磨耳朵”真的有用吗&#xff1f; 在讨论这个问题之前&#xff0c;我们需要先知道&#xff1a;什么是“磨耳朵”&#xff1f; 所谓的“磨耳朵”&#xff0c;其实就是让我们的耳…

通配符证书价格350元

通配符SSL证书是一种特殊的域名SSL证书&#xff0c;这款SSL证书默认保护主域名以及主域名下的所有子域名&#xff0c;因此&#xff0c;子域名比较多的个人或者企事业单位开发者都倾向于选择通配符SSL证书来简化SSL证书管理过程&#xff0c;节省购买SSL证书的资金&#xff0c;降…

python词云图背景颜色修改

python词云图背景颜色修改 词云图介绍wordcloud介绍修改背景颜色 词云图介绍 词云图&#xff08;Word Cloud&#xff09;是一种文本数据的可视化表示形式&#xff0c;它通过字体大小、颜色、布局等视觉元素来展示文本中不同词汇的频率或重要性。词云图中&#xff0c;出现频率高…

纯血鸿蒙APP实战开发——Canvas实现模拟时钟案例

介绍 本示例介绍利用Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 实现思路 本例的的主要实现思路如下&#xff1a; …

C语言:__attribute__((packed))

一、简介 在使用结构体的时候&#xff0c;经常要根据结构体的长度来进行相关判断。但是按照C语言的规则&#xff0c;会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题&#xff0c;如果不需要使用自动对齐的功能&#xff0c;就需要使用到本章的关键字。 二、自动对…

相机内存卡格式化怎么恢复?恢复数据的3个方法

相机内存卡格式化后&#xff0c;许多用户都曾面临过照片丢失的困境。这些照片可能具有极高的纪念价值&#xff0c;也可能包含着重要的信息。因此如何有效地恢复这些照片变得至关重要。本文将详细介绍三种实用的恢复方法&#xff0c;帮助您找回那些珍贵的影像。 下面分享几个实…

JavaScript 动态网页实例 —— 数值处理对象

前言 Math对象用于进行数学运算。其属性是数学中一些常见的常数值,在程序中可以直接使用。Math对象的方法很多,主要完成一些常见的数学运算,如三角函数计算、乘方、开方、求对数等。在 Math 对象的方法中,除了random()之外的所有方法都需要一个或几个参数,并且其用法基本…

24V转3.8V用什么芯片方案-AH8310

在将24V降压至3.8V的电源转换中&#xff0c;AH8310是一个理想的选择。这款芯片是一款降压转换器&#xff0c;输入电压范围为4.5V至36V&#xff0c;输出电压可调&#xff0c;峰值电流可达1.5A。AH8310采用SOT23-6封装&#xff0c;内置MOS&#xff0c;适用于各种应用场合&#xf…

PostgreSQL数据库创建只读用户的权限安全隐患

PostgreSQL数据库模拟备库创建只读用户存在的权限安全隐患 default_transaction_read_only权限授权版本变更说明 看腻了就来听听视频演示吧&#xff1a;https://www.bilibili.com/video/BV1ZJ4m1578H/ default_transaction_read_only 创建只读用户&#xff0c;参照备库只读模…

力扣数据库题库学习(5.7日)--1789. 员工的直属部门

1789. 员工的直属部门 问题链接&#x1f60a; 思路分析 一个员工可以属于多个部门。当一个员工加入超过一个部门的时候&#xff0c;他需要决定哪个部门是他的直属部门。请注意&#xff0c;当员工只加入一个部门的时候&#xff0c;那这个部门将默认为他的直属部门&#xff0c…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

2024年教育创新与人文艺术国际学术会议(ICEIHA 2024)

2024年教育创新与人文艺术国际学术会议(ICEIHA 2024) 2024 International Conference on Educational Innovation and Humanities and Arts 一、【会议简介】 2024年教育创新与人文艺术国际学术会议&#xff0c;将探讨教育创新与人文艺术的结合。 本次会议将汇集全球的专家学者…

python基础---面向对象相关知识

面向对象 可以把数据以及功能打包为一个整体 类: 名称属性(数据)方法 class Person:def __init__(self, name, age):self.age ageself.name namedef print_info:print(self.name, self.age)定义 #经典类 class Dog1:pass# 新式类 class Dog2(object):pass在python3里面这…

漏洞伴随App无时不在,该怎么办?

漏洞攻击、加密被破坏以及数据泄露是App面临的三大重要安全风险&#xff0c;无论开发者如何防范&#xff0c;攻击者往往会找到新的方法&#xff0c;并依靠最新的工具来破坏App安全性。 统计数据表明&#xff0c;大约82&#xff05;的漏洞是在App程序代码中发现的。如果尽快发现…

实测幻方新出的超强AI大模型,中文能力对比GPT4.0不落下风

目前从网上的消息来看&#xff0c;DeepSeek中文综合能力&#xff08;AlignBench&#xff09;开源模型中最强&#xff0c;与GPT-4-Turbo&#xff0c;文心4.0等闭源模型在评测中处于同一梯队。 话不多说&#xff0c;我们开测&#xff01; 1.首先我们来让他直接来一段逻辑推理【并…

Linux学习笔记:信号

信号 在Linux中什么是信号信号的产生方式硬件产生的信号软件产生的信号异常产生的信号 进程对信号的处理信号的保存信号方法更改函数signal信号处理的更改恢复默认信号忽略 信号的管理信号集 sigset_t对信号集的操作 信号的捕捉过程 在Linux中什么是信号 在 Linux 系统中&…

MATLAB添加自编写.m文件或.mat数据并永久全局调用方法

菜单栏选择设置路径&#xff0c;然后“添加并包含子文件夹”&#xff0c;在弹出窗口中找到目标文件夹即可。此方案可以永久地将文件夹加入MATLAB路径。 添加包含自编写.m文件的文件夹&#xff1a; 即可实现永久全局调用。

【Elasticsearch运维系列】Elasticsearch7.12.1启动指定版本JDK:你学废了吗?

一、背景 一套生ES集群&#xff0c;版本为7.12.1&#xff0c;近期频繁告警&#xff0c;频繁出现索引分片异常&#xff0c;索引状态异常&#xff0c;导致应用无法正常写入ES&#xff0c;另外&#xff0c;也经常出现节点掉问题。通过分析相关ES日志&#xff0c;显示和当前JAVA G…