当前位置: 首页 > news >正文

登录校验,JWT令牌技术,过滤器(Filter)拦截器(interceptor)

登录功能:


    前端传递json格式的数据。username(用户名)password(密码)。controller层对数据进行接收,由于是接收json格式的数据,所以我们把它封装到一个对象里面,由于登录是员工进行登录,所以我们封装到员工表中,public Result login(@RequestBody Emp emp){}   接收json格式的数据,我们使用@RequestBody注解,封装到对象中。看到返回类型,我们自定义了一个返回的实体类。LoginInfo
    然后调用service层,进行业务处理。调用mapper层接口,把controller传递给service层的emp参数,传递给mapper层,
    mapper层,根据参数对数据库进行查询,返回值类型是emp。如果查询到结果不为null,代表登录成功,查询结果为null,代表查询失败。
    service层根据mapper层的返回结果进行判断,如果返回的emp不是null,则对返回出来的数据进行封装 return new LoginInfo(emp.getId,emp.getUserName,emp.getname,null),如果查询到没有数据,就返回null。
    由于我们的service1层直接返回了 loginInfo,所以在返回给前端的时候还要进行判断,如果Logininfo不为null,返回Result.success(loginInfo)如果logininfo为null,return Result.error("用户名或密码错误");

引子:

  •     虽然我们写了 登录的接口,但是我们测试发现,就算在没有登录的情况下,用户还是可以随便对我们的系统进行访问。
  •     我们需要进行登录校验,如果用户登录,我们就下发jwt令牌,然后作为登录的标记,在每次用户请求的时候,都要携带这个jwt令牌,统一拦截器,会根据有没有令牌,进行校验。有就放行,没有就拦截。
  •     登录标记:用户登录之后,在后续的每一次请求中,都可以获取到该标记【会话技术】
  •     统一拦截:过滤器filter,拦截器interceptor

登录校验:


    会话技术:


        会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

        会话跟踪:

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。


        会话跟踪方案:

            客户端会话跟踪技术:Cookie

                优点:
  •  HTTP协议中支持的技术

                缺点:

  • 移动App无法使用Cookie
  • 不安全,用户可以自己禁用cookie
  • Cookie不能跨域

                区分跨域的三个维度:

  •   协议,IP/域名,端口

            服务端会话跟踪技术:Session
                优点:
  •  HTTP协议中支持的技术

                缺点:

  •   移动端APP无法使用Cookie
  •   不安全,用户可以自己禁用Cookie
  •    Cookie不能跨域

    JWT令牌:


        优点:
  • 支持PC端、移动端
  •  解决集群环境下的认证问题
  •  减轻服务器端存储压力
        缺点:


            需要自己实现

        全称:

  • JSON Web Token (https://jwt.io/)
  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
        组成:

  •             第一部分:Header(头),记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
  •             第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
  •             第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload融入,并加入指定秘钥,通过指定签名算法计算而来。
        jwt依赖:

   

<dependency> <groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId> <version>0.9.1</version>
</dependency>
        生成令牌:


            @Test public void testGenJwt() {    Map<String, Object> claims = new HashMap<>();    claims.put("id", 10);    claims.put("username", "itheima");    String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "SVRIRUlNQQ==")    .addClaims(claims)    .setExpiration(new Date(System.currentTimeMillis() + 12*3600*1000))           .compact();    System.out.println(jwt);}

        解析令牌:


            @Testpublic void testParseJwt() {    Claims claims = Jwts.parser().setSigningKey("SVRIRUlNQQ==")            .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MTAsInVzZXJuYW1lIjoiaXRoZWltYSIsImV4cCI6MTY5ODYyMjI1NX0.l6D1WG3...")            .getBody();    System.out.println(claims);}

    过滤器Filter:
        快速入门:
            概念:
                Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

            过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

            过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

            快速操作:
                定义Filter:定义一个类,实现
                    @Slf4j //@WebFilter(urlPatterns = "/*")  // 拦截所有请求
public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("DemoFilter init 方法执行了... ");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        log.info("DemoFilter diFilter 方法执行了 放行前执行...");

        chain.doFilter(servletRequest,servletResponse); //放行

        log.info("DemoFilter diFilter 方法执行了 放行后执行...");
    }

    @Override
    public void destroy() {
        log.info("DemoFilter destory 方法执行了...");
    }
}
                配置Filter:Filter类上加@WebFilter注解,配置拦截路径。引导类上加@ServletComponentScan 开启Servlet组件支持。
                    @ServletComponentScan    //开启spring boot对javaweb组件的支持(filter)
@SpringBootApplication
public class TilasRun {

    public static void main(String[] args) {
        SpringApplication.run(TilasRun.class, args);
    }

}
        详解:
            放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
                会回到filter类中
            如果回到Filter中,是重新执行还是执行放行后的逻辑呢?

                会执行放行后的逻辑
            拦截路径:
                拦截具体路径:
                    /login    只有访问 /login 路径时,才会被拦截。
                目录拦截:
                    /emps/*   只有访问/emps下的所有资源,才会被拦截。
                拦截所有:
                    /*     访问所有资源,都会被拦截
            过滤器链:
                介绍:
                    一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。
                顺序:
                    注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。

        登录校验-Filter:
            所有的请求,拦截到了之后,都需要校验令牌吗?
                有一个例外,登录请求不用拦截。
            拦截到请求后,什么情况下才可以放行,执行操作业务?
                有令牌,且令牌校验通过(合法);否则都返回未登录错误结果

            步骤:
                1,获取请求url。
2,判断请求url中是否包含login,如果包含,说明是登录操作,放行。
3,获取请求头中的令牌(token)。
4,判断令牌是否存在,如果不存在,响应401。
5,解析token,如果解析失败,响应401 。
6,放行。

    拦截器Interceptor:
        快速入门:
            概念:
                是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,主要用来动态拦截控制器方法的执行。
            作用:
                拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

            定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。

            注册拦截器

        详解:
            /*    一级路径    能匹配/depts,/emps,/login,不能匹配 /depts/1

            /**  任意路径   能匹配/depts,/depts/1,/depts/1/2

            /depts/*    /depts下的下一级路径    能匹配/depts/1,不能匹配/depts/1/2,/depts
            /depts/**       /detps下的任意级路径      能匹配/depts,depts/1/2  不能匹配 emps/1
            Filter和interceptot的区别:
                接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。

                拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

相关文章:

登录校验,JWT令牌技术,过滤器(Filter)拦截器(interceptor)

登录功能&#xff1a; 前端传递json格式的数据。username&#xff08;用户名&#xff09;password&#xff08;密码&#xff09;。controller层对数据进行接收&#xff0c;由于是接收json格式的数据&#xff0c;所以我们把它封装到一个对象里面&#xff0c;由于登录是员工进行登…...

springCloud项目打包如何把jar放到指定目录下

springCloud项目打包如何把jar发放到指定目录下 maven-antrun-plugin springCloud微服务打包jar&#xff0c;模块过多&#xff1b;我的项目模块结构如下&#xff1a; 我把实体类相关的单独抽离一个模块在service-api下服务单独写在service某块下&#xff0c; 每个模块的jar都…...

vue中2种取值的方式

1.url是这种方式的&#xff1a;http://localhost:3000/user/1 取得参数的方式为&#xff1a;this.$route.params.id 2.url为get方式用&#xff1f;拼接参数的&#xff1a;http://localhost:3000/user?phone131121123&companyId2ahttp://localhost:3000/ 取得参数值的方式…...

Python基础05-函数

零、文章目录 Python基础05-函数 1、函数的作用及其使用步骤 &#xff08;1&#xff09;函数的作用 在Python实际开发中&#xff0c;我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个&#xff1a; ① 代码重用&#xff08;代码重复使用&#xf…...

Ubuntu 设置共享文件夹

一、在Windows中建立一个英文的文件夹 注意&#xff1a;新建文件夹的名称一定要是英文的&#xff0c;不能出现中文的路径&#xff08;可能出现问题&#xff09; 二、在VMware中添加共享文件 3: VMware安装VMware Tools 一般安装成功桌面上会显示这个安装包&#xff0c;&…...

操作系统期末复习-内存管理

一、内存管理 分页存储管理&#xff0c;是将一个进程的逻辑地址空间分成若干个大小相等的片&#xff0c;称为页面或页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;如第0页、第1页等。相应地&#xff0c;也把内存空间分成与页面相同大小的若干个存储块&#xf…...

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

大数据存储技术(3)—— HBase分布式数据库

目录 一、HBase简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;特点 &#xff08;三&#xff09;HBase架构 二、HBase原理 &#xff08;一&#xff09;读流程 &#xff08;二&#xff09;写流程 &#xff08;三&#xff09;数据 flush 过程 &#xf…...

docker容器日志占用磁盘空间过大问题

docker服务运行一段时间后&#xff0c;发现磁盘空间占用很高 其中磁盘占用主要以下目录&#xff1a; /var/lib/docker/containers # 查询占用磁盘较大的文件-升序 du -d1 -h /var/lib/docker/containers | sort -h 控制容器日志大小 法一&#xff1a;容器运行时控制 # max-…...

飞天使-docker知识点6-容器dockerfile各项名词解释

文章目录 docker的小技巧dockerfile容器为什么会出现启动了不暂停查看docker 网桥相关信息 docker 数据卷 docker的小技巧 [rootlight-test playbook-vars[]# docker inspect -f "{{.NetworkSettings.IPAddress}}" d3a9ae03ae5f 172.17.0.4docker d3a9ae03ae5f:/etc…...

oracle-关闭审计功能

1.查看审计功能是否开启 su – oraclesqlplus “/as sysdba”SQL> show parameter audit_trail NAME TYPE VALUE audit_trail string DB 注:VALUE值为DB时,表明审计功能为开启的状态 2.关闭oracle的审计功能 SQL> alter system set audit_trailFALSE scopespfile; Sy…...

three.js(一)

文章目录 three.js环境搭建正文补充 示例效果知识点补充1:一个标准的html知识点补充2:原生的前端框架和Vue框架的区别原生的前端框架Vue框架声明式编程和响应式编程 three.js环境搭建 正文 搭建 Three.js 的环境通常包括以下几个步骤&#xff1a; 1.创建项目目录&#xff1a…...

Python基础入门:语法与数据类型

Python基础入门&#xff1a;语法与数据类型 一、引言 Python是一种简单易学、功能强大的编程语言&#xff0c;广泛应用于数据分析、机器学习、Web开发等领域。本文将介绍Python的基础语法和数据类型&#xff0c;帮助初学者快速入门。 二、Python基础语法 缩进 Python中的缩…...

@Scheduled任务调度/定时任务-非分布式

1、功能概述 任务调度就是在规定的时间内执行的任务或者按照固定的频率执行的任务。是非常常见的功能之一。常见的有JDK原生的Timer, ScheduledThreadPoolExecutor以及springboot提供的Schduled。分布式调度框架如QuartZ、Elasticjob、XXL-JOB、SchedulerX、PowerJob等。 本文…...

【ARM Trace32(劳特巴赫) 使用介绍 14 -- Go.direct 介绍】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 Go.directGo配合程序断点使用Go 配合读写断点使用Go 快速回到上一层函数 System.Mode Go Trace32 Go.direct TRACE32调试过程中&#xff0c;会经常对芯片/内核进行控制&#xff0c;比如全速运行、暂停、单步等等。这篇文章先…...

第二十章 : Spring Boot 集成RabbitMQ(四)

第二十章 : Spring Boot 集成RabbitMQ(四) 前言 本章知识点:死信队列的定义、场景、作用以及原理、TTL方法的使用以及演示代码示例。 Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 24.2死信队列 定义:什么是死信队列? 在RabbitMQ中,并没有提供真正意义…...

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…...

OpenCV开发:MacOS源码编译opencv,生成支持java、python、c++各版本依赖库

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为开发者提供了丰富的工具和函数&#xff0c;用于处理图像和视频数据&#xff0c;以及执行各种计算机视觉任务。 以下是 OpenCV 的一些主要特点和功能&#xff…...

【数据库设计和SQL基础语法】--查询数据--分组查询

一、分组查询概述 1.1 什么是分组查询 分组查询是一种 SQL 查询技术&#xff0c;通过使用 GROUP BY 子句&#xff0c;将具有相同值的数据行分组在一起&#xff0c;然后对每个组应用聚合函数&#xff08;如 COUNT、SUM、AVG等&#xff09;。这允许在数据集中执行汇总和统计操作…...

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类&#xff0c;那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 &#xff08;1&#xff09;操作的实体类FileModel&#xff0c;实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…...

【高级网络程序设计】Block1总结

这一个Block分为四个部分&#xff0c;第一部分是Introduction to Threads and Concurrency &#xff0c;第二部分是Interruptting and Terminating a Thread&#xff0c;第三部分是Keep Threads safety&#xff1a;the volatile variable and locks&#xff0c;第四部分是Beyon…...

linux下查看进程资源ulimit

ulimit介绍与使用 ulimit命令用于查看和修改进程的资源限制。下面是ulimit命令的使用方法&#xff1a; 查看当前资源限制&#xff1a; ulimit -a 这将显示当前进程的所有资源限制&#xff0c;包括软限制和硬限制。查看或设置单个资源限制&#xff1a; ulimit -<option> …...

C++ I/O操作---输入输出

本文主要介绍C I/O操作中的输入输出流。 目录 1 输入输出 2 输入输出流分类 3 C中的输入输出流 4 iostream 5 std::ofstream 6 std::fstream 7 std::getline 1 输入输出 C的输入输出是数据在不同设备之间的传输&#xff0c;即在硬盘、内存和外设之间的传输。 数据如水流…...

会 C# 应该怎么学习 C++?

会 C# 应该怎么学习 C&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&a…...

CentOS 7 部署frp穿透内网

本文将介绍如何在CentOS 7.9上部署frp&#xff0c;并通过示例展示如何配置和测试内网穿透。 文章目录 &#xff08;1&#xff09;引言&#xff08;2&#xff09;准备工作&#xff08;4&#xff09;frps服务器端配置&#xff08;5&#xff09;frpc客户端配置&#xff08;6&#…...

高效网络爬虫:代理IP的应用与实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f91f; 代理 IP 推荐&#xff1a;&#x1f449;品易 HTTP 代理 IP &#x1f485; 想寻找共同学习交流的小伙伴&#xff0c…...

java设计模式-工厂方法模式

1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口&#xff0c;将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点&#xff1a; 用户只需要知道具体工厂的名称…...

Python实验项目9 :网络爬虫与自动化

实验 1&#xff1a;爬取网页中的数据。 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…...

实验三:指令调度和延迟分支

一、实验目的 加深对指令调度技术的理解。加深对延迟分支技术的理解。熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。进一步理解指令调度技术对CPU性能的改进。进一步理解延迟分支技术对CPU性能的改进。 二、实验内容和步骤 首先要掌握MIPSsim模拟器的使用方法。见…...

【Oracle】PL/SQL语法、存储过程,触发器

一、Oracle数据类型 Orcle数据类型说明类比MySQL数据类型字符型CHAR固定长度的字符类型CHAR字符型VARCHAR2可变长度的字符类型VARCHAR字符型LONG大文本类型&#xff0c;最大2G数值型NUMBER数值类型&#xff0c;整数小数都可以&#xff0c;number(5)表示长度5的整数&#xff0c…...

浙江建设网查询/网络优化工程师招聘信息

原文:WPF线性渐变画刷应用之——炫彩线条效果图&#xff1a; Xaml代码&#xff1a; <Rectangle Width"800" Height"10">  <Rectangle.Fill>    <LinearGradientBrush StartPoint"0,0" EndPoint"1,1">    …...

长春建设工程管理中心网站/女教师遭网课入侵直播录屏曝

通过开发电视类的应用和手机的应用&#xff0c;感觉主要有以下三种区别&#xff1a; 1、 分辨率 的不同 手机的分别率320*480,480*800,480*854&#xff09; 机顶盒 &#xff1a;TCL800:800x450 TCL720P:1280x720 机顶盒普遍比手机的分辨率要大很多而且宽要比高要…...

嘉兴seo报价/南京seo收费

现在用wordpress的人越来越多&#xff0c;从个人到企业的博客。这Wordpress众多Wordpress资源有一定的关系。你可以通过选择一个适合自己的模板然后快速的建立自己的网站或者博客&#xff0c;甚者不需要任何专业的技术&#xff0c;就可以建立一个漂亮的站点。但是面对众多的模板…...

wordpress腾讯后台账号/国内比较好的软文网站

点击上方蓝字 关注我们1、游戏简介游戏名称&#xff1a;萌宅物语无限爱心版游戏类型&#xff1a;养成游戏游戏平台&#xff1a;安卓整理时间&#xff1a;2020-05-30游戏评分&#xff1a;8.72、游戏介绍心得技巧分享特别说明游戏已修改为无限爱心版&#xff0c;在游戏中完成教程…...

建筑网官网软件/泉州seo报价

符号键&#xff08;CTRL开头&#xff09; CTRL1 PROPCLOSEOROPEN 对象特性管理器CTRL2或4 ADCENTER 设计中心CTRL3 CTOOLPALETTES 工具选项板CTRL8或QC QuickCalc 快速计算器控制键CTRLA AI_SELALL 全部选择CTRLC或CO/CP COPYCLIP或COpy 复制CTRLD或F6 COORDINATE 坐标CTRLE或F…...

各大浏览器的网址/佳木斯seo

击上方“C语言与CPP编程”&#xff0c;选择“关注/置顶/星标公众号”干货福利&#xff0c;第一时间送达&#xff01;在防御性编程的大框架之下&#xff0c;有许多常识性的规则。人们在想到防御性编程的时候&#xff0c;通常都会想到“断言”&#xff0c;这没有错。我们将在后面…...