登录校验:JWT令牌、Filter、Interceptor

JWT:

全称:JSON Web Token

定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息,由于数字签名的存在,这些信息是可靠的。

组成:

Header(头部):(“alg":"HS256","type":"JWT")签名算法和令牌类型

Base64:基于64个可打印字符(A-Z,a-z,0-9,+,/)来表示二进制数据的编码方式

Payload(有效载荷)

携带一些自定义信息,默认信息

Signature(签名):防止Token被篡改,确保安全性。

应用场景:登录认证

JWT令牌的生成和校验

首先引入依赖,

组织名:io.jsonwebtoken

依赖:jjwt

生成JWT用到Jwts.builder()

自带方法:

signWith(SignatureAlgorithm.HS256,"miyao")//签名算法

setClaims(claims)//自定义内容载荷

setExpiration(new Data(System.currentTimeMillis()+让JWT令牌有效的时间))

compact()

注:claim是一个Map类型的数据

解析JWT用到Jwts.parser()

方法:

setSigningKey("miyao")

parseClaimsJws("生成的JWT令牌")

getBody()

可以用Claim来接受第二部分的内容。

JWT校验时使用的签名密钥必须和生成JWT令牌使用的密钥配套。

JWT令牌跟踪会话

令牌生成:登录成功后生成JWT令牌并返回给前端

将JWT令牌封装在result中返回

一个案例:

if(查询结果不为空){

 //可以用登录用户的信息构造一个claims

 String jwt = JwtUtils.generateJwt(claims);

 return Result.success(jwt)

}else{

return Result.error("用户名或密码错误");

}

过滤器Filter:

javaweb三大组件之一(Servlet\Filter\Listener)

过滤器可以把对资源的请求全部都拦截下来

通用操作:登录校验、统一编码处理、敏感字符处理。

过滤器开发步骤:

1、定义一个类,实现Filter接口,并重写所有方法:(可以给filter单独开一个包)

init()  初始化方法,Web服务器启动后创建Filter调用,只调用一次

doFilter()  拦截请求时,调用该方法

                chain.doFilter(request,response);//放行

destroy()  销毁方法,服务器关闭时调用,只调用一次

2、配置Filter:

在Filter类上加@WebFilter注解,配置拦截资源的路径

@WebFilter(urlPattern = "/*")

在springboot启动类上加@ServletComponentScan开启Servlet组件支持。

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

执行流程:放行前逻辑、放行、放行后逻辑

(就是在chain.doFilter(request,response);前后执行的逻辑)

  1. 放行前逻辑(before chain.doFilter(request, response)):

    • 参数处理:对请求参数进行预处理或校验,如解析请求参数、验证参数合法性等。
    • 请求处理:对请求进行处理,如记录请求日志、修改请求信息等。
    • 鉴权逻辑:进行权限校验,确定请求的访问权限是否符合要求。
    • 数据加工:对数据进行预处理,如数据加密、解密等。
    • 异常处理:对可能发生的异常进行预处理,如捕获异常并记录日志。
  2. 放行后逻辑(after chain.doFilter(request, response)):

    • 响应处理:对响应进行处理,如记录响应日志、修改响应信息等。
    • 数据加工:对响应数据进行处理,如数据加密、解密等。
    • 统计信息:统计请求处理的相关信息,如请求处理时间、请求频率等。
    • 异常处理:对可能发生的异常进行后续处理,如捕获异常并返回错误信息。

拦截路径:Filter可以根据需求,配置不同的拦截资源路径:

可以进行目录拦截,比如@WebFilter(urlPattern = "/CSDN/*")拦截该目录下的所有资源。

过滤器链:一个WEB应用中可以配置多个过滤器。

过滤器顺序与字符串类名顺序一致。

实际业务:登录校验

登录校验我们需要在过滤器中,完成如下几步。

doFilter的参数:ServletRequest request,ServletResponse response,FilterChain chain

首先要将ServletRequest request,ServletResponse response强转为HTTP类型

1、获取请求url

通过request的getRequestURL方法获取请求路径。

2、判断请求url中是否包含login,如果包含则说明是登录操作,放行

if(url.contains("login")){

        chain.doFilter(request,response);

        return;

}

3、获取请求头中的token

String jwt = req.getHeader("token");

4、判断令牌是否存在,如果不存在,返回错误结果(未登录)

使用StringUtil工具类的hasLength方法来判断token是否存在

如果不存在返回错误信息:

Result error = Result.error("NOT_LOGIN");

这里我们需要手动将error转换为JSON类型的数据再返回!//使用阿里巴巴的fastJSON

String notLogin = JSONObject.toJSONString(error);

resp.getWriter().write(notLogin);

return;

5、解析token,如果解析失败,返回错误结果(未登录)

使用try-catch语句,利用JwtUtil工具类进行解析6、

Spring框架提供的,用来动态拦截控制器方法的执行

拦截器Interceptor:

拦截器开发步骤:

1、定义拦截器,实现HandlerInterceptor接口,并重写方法(可以给interceptor单独开一个包)

boolen preHandle目标资源方法执行前执行,返回true,放行,返回false,不放行。

postHandle()目标资源方法执行后执行

afterHandle()视图渲染完毕后执行,最后执行

2、配置拦截器

设置一个配置类WebConfig重写WebMvcConfigurer接口,@Configuration

实现addInterceptors方法

registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");

excludePathPatterns("/login")可以设置除了这个资源以外其他都拦截

拦截器拦截路径与执行流程:

实际业务:登录校验

与过滤器一致。将放行代码改为return true即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日学习笔记:C++ STL 的set、multiset

定义 (自动排序,可指定自定义排序准则) 排序准则 特点 (不同通过迭代器直接修改元素值,只能先删除后添加) 操作函数 运行期指定排序准则

【项目实践】VS配置Qt

文章目录 前言版本使用具体步骤1)安装Qt或者添加删除组件2)VS安装Qt Visual Studio Tools 如何使用遇到的问题双击ui文件编辑报错 前言 最近因为一个项目,需要使用Qt,本来想使用Python的,但是由于另外一个第三方的库是…

Linux:vim编辑器的使用

1.Vim的安装 Linux默认是安装了的vim,未安装则可以使用以下指令安装。 yum install vim -y 2.Vim的四种模式 (1)命令模式 使用VIM编辑器时,默认处于命令模式。在该模式下可以移动光标位置,可以通过快捷键对文件内容…

路灯单灯控制器 智慧路灯杆智能照明新宠

路灯单灯控制器是现代城市管理中非常重要的设备之一。它们不仅可以提供照明功能,还可以通过智能控制系统实现远程监控和调节。   路灯单灯控制器通过感知环境亮度和运行状态,实现对路灯的智能控制。它使用先进的传感器技术,能够实时感知路灯…

von Mises-Fisher Distribution

1. 概率密度函数 关于 Bessel Function 请参阅《贝塞尔函数》《Modified Bessel Function of the First Kind》。 2. Relation to Normal Distribution 进一步的推导: G p ( x ; μ , κ ) ( κ 2 π ) p e x p ( − κ ( x − μ ) ⊺ ( x − μ ) 2 ) ( κ 2 π…

109 项目整合 spring-quartz 启动自动执行定时任务

前言 项目中使用了 quartz 来支持定时任务的相关基础支撑, 但是 最近添加了一个 资源消耗比较高的定时任务, 发布到测试环境之后, 发现服务突然 起不起来了[资源比较有限] 然后 查看了一下日志, 这个定时任务怎么在执行?, 不是 配置的是 凌晨两点么, 然后 仔细一看 几乎配置…

跳槽多次未成功,问题源自何处?

众所周知,2023年市场很难!看着企业们纷纷裁员,甚至连内推这个后门都走不通!哪怕有面试,都是屡屡碰壁,你想清楚问题出在哪了吗?😭“求职不得,夜不能寐;三更半夜…

免费升级https的方式(含教学)

背景:随着现在全民网络安全意识的日益提升,各个网站实现的https数量也随之提升,那么如何将原本网站的http访问方式升级为https呢?下面均为干货内容。 目录 http访问和https访问的区别: 实现https后有哪些好处&#x…

两个现货白银理财产品投资技术分析方法

现货白银是投资市场中比较受欢迎的理财产品。要投资现货白银,我们需要具备一定的金融投资经验。下面我们就来讨论一下,在现货白银这个理财产品的投资过程中,常常用到的一些技术分析方法。 宏观的趋势分析法。在现货白银理财产品投资中&#x…

助农抢农时,千耘导航保春耕

助农抢农时,千耘导航保春耕 在农业生产中,农机的作用不可忽视。随着人们生活水平的提高和科技的进步,对于农机的需求也越来越大。而千耘农机导航作为农机自动驾驶领域独具优势的一款设备,正以火爆的势头成为众多农户的首选。 在春…

C 结构体链表的一点想法

去年写的 白天和同事在聊一个东西,关于 c 里面链表的使用,通常是用一个 list 作为结构体的成员,然后通过 list 把结构体串起来,就像串糖葫芦一样。 而我发现项目中有一个结构体有三个类似 list 这样的成员,一个成员是…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…

3/20作业

1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xff09; 4> 展示出工资…

AL379芯片和AL383芯片是一款DC-DC升压芯片IC

首先&#xff0c;我们来了解HU6283芯片5V升压12V芯片的工作原理。这种芯片通常采用开关电源技术&#xff0c;通过高频开关控制&#xff0c;将5V的输入电压转换为12V的输出电压。开关电源技术具有高效、稳定、体积小等优点&#xff0c;因此在电子设备中得到了广泛应用。5V升压12…

C语言基础知识点(十八)联合、

【C语言】联合体-共用体 &#xff08;union&#xff09; 详解-阿里云开发者社区 (aliyun.com) 联合 在C语言中是一种数据类型&#xff0c;能在同一个内存空间中存储不同的数据类型&#xff08;不是同时储存&#xff09;。 典型用法&#xff1a;设计一种表以存储及无规律、实…

(C语言) print输出函数系列介绍

(C语言) print输出函数系列介绍 文章目录 (C语言) print输出函数系列介绍前言输出系列函数&#x1f5a8;️printf&#x1f5a8;️sprintf & snprintf&#x1f5a8;️fprintf&#x1f5a8;️vprintf&#x1f5a8;️dprintf&#x1f5a8;️puts&#x1f5a8;️fputs&#x1f…

Java开发---上海得帆(一面)

面试感受 这是我的第一次面试&#xff0c;我感觉我这次面试的很差&#xff0c;很糟糕&#xff0c;十分的糟糕&#xff0c;万分的糟糕。第一次面试&#xff0c;面试了半个小时。我去真的好紧张&#xff0c;脑子里一篇空白。脑子空白还不是最惨的&#xff0c;最惨的是那个八股文…

【C语言进阶篇】自定义类型:联合体和枚举

【C语言进阶篇】自定义结构体类型&#xff1a;联合体和枚举 &#x1f308;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 联合体大小的计算 2. 枚举 2.1 枚举…

动态内存经典笔试题分析及柔性数组

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

链式二叉树

前言 本章将重点讲解链式二叉树的四种遍历方式。 一、链式二叉树 1、引入链式二叉树 我们知道完全二叉树可以使用堆存储&#xff0c;那非完全二叉树&#xff1f; 非完全二叉树不适合用堆来存储&#xff0c;因为浪费空间&#xff0c;所以非完全二叉树使用链式存储。 2、链式二…
最新文章