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

news2024/9/27 21:28:45

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.coloradmin.cn/o/1541774.html

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

相关文章

基于物理的实时渲染 -- PBR

简介 PBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模…

如何申请代码签名证书

代码签名证书也是数字证书的一种,其主要作用是对可执行脚本、软件代码和内容进行数字签名的数字证书。代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时,能通过数字签名验证软件来源,确认软件、代码没有被非法篡改或…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 1 套

#需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! 某企业根据自身业务需求&#…

数据结构和算法:树

二叉树 与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。 /* 二叉树节点结构体 */ struct TreeNode {int val; // 节点值TreeNode *left; // 左子节点指针TreeNode *right; // 右子节点指针TreeNode(int x) : val(x),…

项目管理证书有何用?这些PMP考试机会一定要抓住

项目管理证书有何用?这些PMP考试机会一定要抓住! PMP认证的中文全称是“项目管理专业人士资格认证”,是目前国际上声誉较高并且含金量比较高的项目管理证书之一,本人有幸考过,也通过PMP认证成功转岗,应该也…

每日一题 --- 反转链表[力扣][Go]

反转链表 题目:206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出&a…

mybatis实践篇(二)

自定义类型处理器(TypeHandler) 实体 package com.wyl.mybatis.entity;import java.util.Date;/*** Description 省市区-字典* Author wuyilong* Date 2024-02-26*/public class FullCity {private static final long serialVersionUID 1L;/*** 主键I…

python之(19)CPU性能分析常见工具

Python之(19)CPU性能分析常见工具 Author: Once Day Date: 2024年3月24日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏:Python开发_Once-Day的博客…

车载测试 UDS诊断 CANoe使用(线下实操项目)

本周末2天的时间,可以线下带大家对车载项目: uds诊断进行实操训练和CANoe工具的灵活使用 本博主从事新能源汽车的研发部,主要是嵌入式方面的,对车载测试的底层逻辑非常熟悉。 需要项目或者CANoe工具实操的可以关注并私信我

【数据结构和算法初阶(C语言)】二叉树的链式结构--前、中、后序遍历实现详解,节点数目计算及oj题目详解---二叉树学习日记③

1.二叉树的链式存储 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存…

[自研开源] MyData v0.7.5 更新日志

开源地址:gitee | github 详细介绍:MyData 基于 Web API 的数据集成平台 部署文档:用 Docker 部署 MyData 使用手册:MyData 使用手册 试用体验:https://demo.mydata.work 交流Q群:430089673 介绍 MyData …

(ES6)前端八股文修炼Day2

1. let const var 的区别 var: var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域,而不是块作用域,这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明,而且变量的值可以在声明前使用,这可能…

一文带你看懂甘特图,项目进度、资源分配清清楚楚

带大家看懂一个甘特图,我们打开一个zz-plan 的甘特图,左边是任务栏,右边是进度条,上面这个是时间,下面是一个整个项目的一个状态,任务、工时、周期和进度。 这一列颜色灰色的表示是当天,我们从…

Linux常用命令和基础命令合集---非常推荐

非常好用的Linux通用基础常用命令和高级命令。 下载链接:https://download.csdn.net/download/lishihuijava/89026399

2024腾讯云服务器2核4G、4核8G、8核16G配置最新收费标准

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

城市内涝水文水动力模型软件

原文链接:城市内涝水文水动力模型软件https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598401&idx3&sn0c4c86b3a5d09a75b8f07e6fad81aa9c&chksmfa8200a6cdf589b0970a6854869e8e3a9f132fe40a19977863c091cbcf6d9786f067e0c5651e&token1…

Autosar MCAL配置——ADC

文章目录 前言一、创建Adc硬件单元二、创建、配置Adc通道1.根据电路原理图,有多少ADC采样引脚,就创建多少ADC采样通道。2.配置Adc通道3.配置ADC组4.配置ADC扫描组三、配置ADC通用设置前言 ADC,即Analogue Digital Converter缩写。简单来说,它是将输入的模拟信号转换为数字…

[数据结构]二叉树的建立与遍历(递归)

一、二叉树的遍历与建立 首先我们拥有如下二叉树: 要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历 1.前序遍历 前序遍历:根,左子树,右子树 遍历的结果就是:1 2 4 8 N N 9 N N 5 10 N N 11 N N 3 6 N N 7 N N 2.中序遍历 中序遍历:左子树…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

day29|leetcode|C++|491. 非递减子序列|46. 全排列|47. 全排列 II

Leetcode 491. 非递减子序列 链接:491. 非递减子序列 thought: 设 stack 中最后一个值的位置为 last。如果 stack 为空,则 last -1。 设当前正在处理的位置为 pos。如果在 nums 的子区间 [last1, pos) 中,存在和 nums[pos] 相同的值&…