登录校验: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.mzph.cn/news/768076.shtml

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

相关文章

回溯、取模、日期计算

C回溯 文章目录 C回溯1、回溯常见模板2、取每位数的模3、回文日期 1、回溯常见模板 /*回溯法模板def func():if 满足条件:return resultfor range 选择列表:选择func()撤销选择 */ 代码示例&#xff1a;1.求1~n的全排列并打印出来。 #include<bits/stdc.h> using names…

银行5G短消息应用架构设计

&#xff08;一&#xff09;RCS简介 1.1 RCS的提出与标准制定 RCS(Rich Communication Services & Suite&#xff0c;富媒体通信)是GSMA(Groupe Speciale Mobile Association&#xff0c;全球移动通信系统协会)在2008年提出的一种通讯方式&#xff0c;RCS融合了语音、消息…

基于STM32的智能快递箱设计与实现

基于STM32的智能快递箱设计与实现 **摘要&#xff1a;**随着电子商务的飞速发展&#xff0c;快递业务日益繁荣&#xff0c;智能快递箱作为解决“最后一公里”配送难题的有效手段&#xff0c;受到了广泛关注。本文设计并实现了一款基于STM32微控制器的智能快递箱系统&#xff0…

springboot3+jdk17+MP整合最新版jersey详细案例,正真做到拿来即用

如题&#xff0c;springboot3.x java17 MP 整合最新jersey&#xff0c;各种请求类型&#xff08;实战/详解&#xff09; 文件上传下载 jersey资源注册 拦截器&#xff08;JWT&#xff09; 跨域处理 全局异常 Valid注解校验 等等 &#xff0c;除非你必须整合security&am…

SpringCloud Alibaba Nacos简单应用(二)

&#x1f600;前言 本篇博文是关于SpringCloud Alibaba Nacos简单应用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的…

【spring】@Lazy注解学习

Lazy介绍 Lazy 注解是一个配置注解&#xff0c;用于指示 Spring 容器在创建 bean 时采用延迟初始化的策略。这意味着&#xff0c;除非 bean 被实际使用&#xff0c;否则不会被创建和初始化。 在 Spring 框架中&#xff0c;默认情况下&#xff0c;所有的单例 bean 在容器启动时…

【Linux】模拟实现shell(bash)

目录 常见的与shell互动场景 实现代码 全部代码 homepath()接口 const char *getUsername()接口 const char *getHostname()接口 const char *getCwd()接口 int getUserCommand(char *command, int num)接口 void commandSplit(char *in, char *out[])接口 int execut…

aurora仿真使用等

IP设置 代码 aurora_8b10b aurora_8b10b_inst (/**********************************************************************************///axi_stream tx.s_axi_tx_tdata(s_axi_tx_tdata), // input wire [0 : 31] s_axi_tx_tdata.s_axi_tx_tkeep(s_axi_tx_…

2024开年首展,加速科技展台“热辣滚烫”

3月20日&#xff0c;备受瞩目的半导体行业盛会SEMICON China 2024在上海新国际博览中心盛大启幕&#xff0c;展会汇集了来自全球的半导体领域顶尖企业与专业人士。加速科技作为业界领先的半导体测试设备供应商携重磅测试设备及解决方案精彩亮相&#xff0c;展示了最新的半导体测…

KIMI爆了!对比文心一言和通义千问它到底有多强?

原文:赵侠客 前言 最近国产大模型KIMI爆了大部分人应该都知道了&#xff0c;从我个人的感受来看这次KIMI爆了我不是从技术领域接触到的&#xff0c;而是从各种金融领域接触到的。目前国内大模型可以说是百模大战&#xff0c;前几年新能源大战&#xff0c;今年资本割完韭菜后留…

简述TCP的三次握手与四次挥手

A表示客户client&#xff0c;即主动发起连接的应用程序&#xff1b;B表示服务器&#xff0c;即被动等待连接建立的应用进程。 TCP建立连接&#xff0c;三报文握手&#xff0c;也可以是四报文握手。 总流程可以简化为&#xff1a;A向B发送连接请求&#xff0c;B向A确认&#xf…

JAVA学习-NIO.Files工具类

Java NIO&#xff08;New IO&#xff09;提供了一组用于处理文件和文件系统的工具类&#xff0c;其中包含了Files工具类。Files工具类提供了对文件和目录进行操作的静态方法&#xff0c;如创建、复制、删除、移动、重命名等等。以下是Files工具类的特点、常用方法以及与其他类的…

面试宝典:MySQL索引进阶深度分析

在数据库高级开发的面试中&#xff0c;索引是一个绕不开的重点话题。MySQL中的索引机制对于查询性能有着决定性的影响。本文将深入探讨MySQL索引的高级特性和优化策略&#xff0c;帮助开发者在面试中展现出对数据库索引机制的深刻理解和高级应用能力。 索引的基本概念 MySQL中…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

C++之循环中使用auto关键字

在C中&#xff0c;auto是一个类型说明符&#xff0c;用于自动推导变量的类型。编译器会根据初始化表达式的类型来自动推断变量的类型。使用auto可以使代码更加简洁&#xff0c;并减少手动键入类型信息的需要&#xff0c;尤其是在处理复杂类型或模板时。 在C中&#xff0c;使用…

codeTop102:二叉树的层序遍历

前言 在已知BFS的方式后&#xff0c;知道每次从队列中取一个节点&#xff0c;就要将这个节点的所有子节点按照顺序放入队列。 难点在于怎么确定将同一层的节点放在一个数组里面的输出&#xff0c;也就是输出一个二维数组&#xff1f; 解决方法: 每次while循环将队列上轮放入的…

android四大组件之一ContentProvider

ContentProvider ContentProvider 是 Android 中用于实现数据共享的一种组件&#xff0c;它可以让不同的应用程序之间共享数据。数据通常以表格的形式组织&#xff0c;类似于数据库的表。其他应用程序可以通过 ContentResolver 来查询或修改这些数据。 ContentProvider、Conten…

什么是C++中的指针和引用?它们有什么区别?/ 数组名和指针(这里为指向数组首元素的指针)区别?

一、什么是C中的指针和引用&#xff1f;它们有什么区别&#xff1f; 在C中&#xff0c;指针和引用都是重要的概念&#xff0c;它们用于处理内存地址和变量之间的关系&#xff0c;但两者之间存在明显的区别。 指针是一个特殊的变量&#xff0c;其值为另一个变量的地址。换句话…

【课程】Mysql优化

Mysql优化教程01-关键技术.wmvMysql优化教程02-表的设计.wmvMysql优化教程03-慢查询(一).wmvMysql优化教程04-慢查询(二).wmvMysql优化教程05-慢查询(三).wmv Mysql优化教程06-索引(一).wmv Mysql优化教程07-索(二).wmv Mysql优化教程08-索引(三).wmv Mysql优化教程09-索(四).w…

Vue2(十):全局事件总线、消息订阅与发布、TodoList的编辑功能、$nextTick、动画

一、全局事件总线&#xff01;&#xff01; 任意组件间通信 比如a想收到别的组件的数据&#xff0c;那么就在a里面给x绑定一个demo自定义事件&#xff0c;所以a里面就得有一个回调函数吧&#xff0c;然后我要是想让d组件给a穿数据&#xff0c;那就让d去触发x的自定义事件&…