登录校验: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,一经查实,立即删除!

相关文章

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

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

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

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

SpringCloud Alibaba Nacos简单应用(二)

😀前言 本篇博文是关于SpringCloud Alibaba Nacos简单应用,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的…

【spring】@Lazy注解学习

Lazy介绍 Lazy 注解是一个配置注解,用于指示 Spring 容器在创建 bean 时采用延迟初始化的策略。这意味着,除非 bean 被实际使用,否则不会被创建和初始化。 在 Spring 框架中,默认情况下,所有的单例 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日,备受瞩目的半导体行业盛会SEMICON China 2024在上海新国际博览中心盛大启幕,展会汇集了来自全球的半导体领域顶尖企业与专业人士。加速科技作为业界领先的半导体测试设备供应商携重磅测试设备及解决方案精彩亮相,展示了最新的半导体测…

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

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

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

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

codeTop102:二叉树的层序遍历

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

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

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

洛谷_P2678 [NOIP2015 提高组] 跳石头_python写法

P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) d, n, m map(int,input().split())data [0] for i in range(n):value int(input())data.append(value) data.append(d)def check(mid):now 0cnt 0for i in range(1,n2):if abs(data[now]-da…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

从0写一个问卷调查APP的第13天-1

1.今日任务 我也只是一个大学生,有什么思路不对的地方给我指出来哟! 分析:上次我们实现了任务调查的插入。但是我们插入的问卷调查只有它的标题,也就是这个问卷调查是什么我们告诉数据库了,但是现在我们还没有给它添加任何问题&…

蓝桥杯真题:幸运数字

这道题可以用 integer.string()求每个进制的数,但这里要每一位数相加,所以用这个方法会比较麻烦,如下 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scan new Sc…

华为OD机试真题-推荐多样性-2024年OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推 2. 每个列表的元素尽量均…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册,主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中,注册后置处理器&a…

关于四篇GNN论文的阅读笔记PPT:包括GATNE,AM-GCN,HGSL和coGSL

关于四篇GNN论文的阅读笔记PPT:包括GATNE,AM-GCN,HGSL和coGSL 前言GATNEAM-GCNHGSLcoGSL 前言 这里的PPT主要是在跟Graph Transformer一起的: 【图-注意力笔记,篇章1】Graph Transformer:包括Graph Trans…

mysql基础3索引

存储引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。 1). 建表时指定存储引擎 CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n…

JAVA的学习日记DAY4

算术运算符 关系运算符(比较运算符) 关系运算符的结果都是boolean型,也就是要么是true,要么是false 关系表达式 经常用在if结构的条件中或循环结构的条件中 逻辑运算符 && 和 & 使用区别 &&短路与&#xff…