JavaWeb-登录校验

news2024/11/16 21:47:07

会话技术

浏览器使用的是http协议,多次请求间数据是不能共享的,例如我们要去访问用户数据的接口,但这时候用户是否已经登入了呢?是不知道的,为了解决这个问题,于是引入了会话跟踪技术。

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

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

会话跟踪方案

1.cookie

存储在浏览器 。携带的值为键值对形式name=value

浏览器第一次发起请求->服务器设置cookie,存储相关信息,例如用户名,id ->服务器自动响应数据时携带cookie->浏览器自动接收cookie并存储本地 ->后续请求将cookie自动携带到服务端->服务器判断cookie值是否存在。

优点:

  • HTTP协议中支持的技术

缺点:

  •  移动端APP无法使用Cookie
  •  不安全,用户可以自己禁用Cookie
  •  Cookie不能跨域(跨域就是当前所处位置和请求地址的协议,ip,端口三着有不同的)

注意:上述中用了三个自动,这是因为cookie是HTTP协议支持的技术,请求头中有cookie,就是存储服务器之前发回来的cookie,响应头有Set-Cookie用于服务器向用户发送Cookie。

设置CookieAPI:

获取CookieAPI:

2.session

优点

  • 存储在服务器,安全

缺点

  • 服务器集群条件下无法直接使用Session
  • Cookie的缺点

session 存储在服务器,底层根据Cookie实现,响应的值为JSESSIONID(固定)="SessionId"


浏览器第一次请求服务器->服务器获取session对象->服务器通过Cookie响应session id->浏览器接收session id并存储在本地->二次请求将session id携带到服务端->通过SessionId去找到对应的session会话对象

从Session对象中获取值:

在Session对象中存储值:

3.令牌技术

优点:

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

令牌就是一个用户标识,就是一个字符串

用户登入请求成功->服务器生成一个令牌->响应令牌给前端,前端存储起来->前端后续请求响应令牌给服务端->服务端校验令牌有效性,共享数据可以存储在令牌当中。

下面讲解一个功能强令牌:JWT令牌

全称:JSON Web Token (https://jwt.io/)

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

JWT令牌由三部分组成,每部分由.隔开

  1. Header(头),记录令牌类型、签名算法等,由base64进行编码,例如:{"alg":"HS256","type":"JWT"}
  2. Payload(有效载荷),携带一些自定义信息、默认信息等,由base64进行编码 ,例如:{"id":"1","username":"Tom"}
  3. Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

JWT令牌生成解析:

引入依赖

使用jwts工具类进行生成令牌

0

解析令牌 

当我们修改任意一部分的数据,或者令牌过期,解析都会报错 

 过滤器Filter

  • 概念:Filter 过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Filter使用:

1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。

Filter接口中有三个方法,分别是

  • Init :初始化方法,default修饰,可以不用实现,web服务器启动时,创建Filter调用,只调用一次
  • doFIlter:拦截到请求时调用,调用多次
  • destory:服务器关闭时调用,default修饰,可以不用实现,只调用一次

2. 配置Filter:Filter类上加@WebFilter注解,通过urlPatterns属性 配置拦截资源的路径。启动类上加@ServletComponentScan开启Servlet组件支持。

拦截路径参数:

doFilter拦截到请求之后,可以通过调用chain.doFilter(request,response); 来放行访问资源。只有放行了才能访问到资源。访问完资源之后又会回到doFilter方法执行chain.doFilter方法之后的代码

过滤器链:

一个Web应用中,可以配置多个过滤器,多个过滤器就形成了过滤器链

过滤器链中的过滤器会逐渐一个个放行,先调用放行前的逻辑,然后放行到下一个过滤器,到资源访问之后会从最后一个过滤器放行后的逻辑逐渐往前一个过滤器执行。过滤器的排序根据类名大小排序

现在我们来尝试一下写好登入校验过滤器的代码,我们先来分析一下

1.获取前端的访问路径

2.查看是否是登录路径如果是登录路径,直接放行,并将方法结束

3.获取请求头中的令牌

4.校验令牌,解析如果不存在返回错误信息

5.令牌解析错误返回错误信息

6.放行

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOEx
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;

//1.获取请求ur1。
String url = req.getRequestURL () . toString () ;
log.info("请求的url:{}",url);

//2.判断请求ur1中是否包含login,如果包含,说明是登录操作,放行。
if (url.contains ("login") ) {
log.info("登录操作,放行 ….. ");
chain.doFilter (request, response) ;

return;
}
//3.获取请求头中的令牌(token)。
String jwt = req.getHeader ( name: "token") ;

//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)。
if (!StringUtils. hasLength (jwt) ) {
log.info(“请求头token为空,返回未登录的信息”);
Result error = Result.error("NOT_LOGIN");
//手动转换 对象 -- json
String notLogin = JSONObject.toJSONString(error) ;
resp.getWriter().write (notLogin) ;
return;

}
阿里巴巴fastJSON
-- >

//5.解析token,如果解析失败,返回错误结果(未登录)。
try {
JwtUtils.parseJWT(jwt) ;
}catch(Exception e){//jwt解析失败
e.printStackTrace () ;
log.info(“解析令牌失败,返回未登录错误信息”);
Result error = Result.error("NOT_LOGIN");
//手动转换 对象 -- json
String notLogin = JSONObject.toJSONString(error) ;
resp.getWriter().write (notLogin) ;
return;

//6.放行。
log.info("令牌合法,放行");
chain.doFilter (request, response) ;
}

拦截器Interceptor

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

使用:

1.定义拦截器,实现HandlerInterceptor接口,接口中实现了三个方法

分别在不同时期执行,并将其交给IOC容器

2.定义配置类,实现接口WebMvcConfigurer,并加上@Configuration注解表明是Spring中的配置类,然后通过重写addInterceptors方法,调用registry的addIntercepto方法来注册拦截器

3.然后通过addPathPatterns方法来配置拦截的资源也可以通过excludePathpatterns来配置不拦截的资源

执行流程:

浏览器访问Web应用->过滤器拦截前逻辑->过滤器放行->进入Spring的环境,tomcat不识别Spring的Controller程序,但识别Servelet,Spring环境提供了一个核心的Serelet:DispatcherServelet。他把请求转给拦截器->拦截器先执行preHandle方法如果放行,访问Controller方法->执行拦截器的postHandle和afterCompletion方法->返回给DispathcherServelet->执行拦截器放行后的代码

Filter和Interceptor区别:

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现Handlerlnterceptor接口。
  • 拦截范围不同: 过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

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

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

相关文章

一次Ambari安装记录

引言 Ambari是一个开源的Apache项目,它提供了一个直观易用的Web界面,用于管理、监控和配置Apache Hadoop集群。它是一个集群管理工具,可以帮助管理员轻松地部署、管理和监控Hadoop集群的各种组件,如HDFS、YARN、MapReduce、Hive、HBase等。通过Ambari,用户可以在集群中添…

【GPTs分享】GPTs分享之Image Recreate | img2img​

简介 该GPT是一个专门用于图像编辑、重建和合并的工具。它通过详细的自动图像描述和生成,帮助用户从源图像中重现或修改图像。此工具设计用于为视障用户提供图像内容的详细描述,并生成全新的图像,以满足特定的视觉需求。 主要功能 \1. 图像…

存储人视角:人工智能AI + 大模型

原文来自于知乎存储专栏: 存储人视角:人工智能AI 大模型 前沿 我的角色 背景 AI 出场 效果 一个宠娃狂魔 娃喜爱并有奥特曼玩具 她的奥特曼玩具会跳舞了 娃对我的崇拜和爱又多了一分......amazing 杭州网商路艾弗森 球队需要制作LOGO 形象生动…

【学习】对于加密接口、签名接口如何进行性能测试

随着科技的飞速发展,加密接口和签名接口在我们的日常生活中扮演着越来越重要的角色。从在线支付到信息安全,它们始终默默地守护着我们的数字世界。然而,随着应用场景的不断扩展,性能测试变得尤为重要。今天,让我们一起…

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论:一般用inner join来改写in和exist,用left join来改写not in,not exist;(本文会比较内连接,包含in子句的子查询,exist的性能 ) 1. 本文总结自高性能mysql 6…

PLC中连接外部现场设备和CPU的桥梁——输入/输出(I/O)模块

输入(Input)模块和输出(Output)模块简称为I/O模块,数字量(Digital,又称为开关量)输入模块和数字量输出模块简称为DI模块和DQ模块,模拟量(Analog)输…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

Linux学习第52天:Linux网络驱动实验(二):一往(网)情深

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记的目录如下&#xff1a; 四、I.MX6ULL网络驱动简介 1.I.MX6ULL网络外设设备树 2.I.MX6ULL网络驱动源码简析 3.fec_netdev_ops操作集 4.Linux内核PHY子…

删除word中下划线的内容

当试卷的题目直接含答案&#xff0c;不利用我们刷题。这时如果能够把下划线的内容删掉&#xff0c;那么将有利于我们复习。 删除下划线内容的具体做法&#xff1a; ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…

OSI网络七层协议 ——(随手笔记)

1.OSI OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层…

【论文阅读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

【Java基础】19.继承(面向对象的三大特征:封装、继承、多态)

文章目录 前言一、继承的概念二、继承的步骤1.类的继承格式2.继承的实例3.继承类型 三、继承的特性四、继承的关键字1.extends关键字2.implements关键字3.super 与 this 关键字4.final 关键字 五、构造器 前言 一、继承的概念 继承是java面向对象编程技术的一块基石&#xff…

Git - 在PyCharm/Idea中集成使用Git

文章目录 Git - 在PyCharm/Idea中集成使用Git1.新建GitHub仓库2.将仓库与项目绑定3.在PyCharm中使用Git4.新建Gitee仓库5.将仓库与项目绑定6.在IDEA中使用Git Git - 在PyCharm/Idea中集成使用Git 本文详细讲解了如何在 PyCharm 或 Idea 中配置 Gitee 或 GitHub 仓库&#xff0…

【算法】深度优先遍历(DFS)算法详解与实现

文章目录 1.算法原理2. 常见的深度优先遍历方式3. 代码实现总结 深度优先遍历&#xff08;DFS&#xff09;是一种常用的树或图的遍历算法&#xff0c;它通过尽可能深地搜索树或图的分支&#xff0c;直到路径上的所有节点都被访问完毕&#xff0c;然后再回溯到上一层&#xff0c…

win10 系统怎么开启 guest 账户?

win10 系统怎么开启 guest 账户&#xff1f; 段子手168 前言&#xff1a; guest 账户即所谓的来宾账户&#xff0c;我们可以通过该账户访问计算机&#xff0c;如打印机共享等&#xff0c;但会在一定程度上受到限制。下面分享 WIN10 系统开启 guest 来宾账户的几种方法。 方法…

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢&#xff1f;在ES官网中提供了各种语言的客户端&#xff0c;我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择&#xff0c;那么他们有什么区别&#xff1f;这…

Clion 2023.1.5 最新详细破解安装教程

CLion 最大的优点是跨平台&#xff0c;在Linux、Mac、Windows 上都可以运行。CLion 还同时支持 GCC、Clang、MSVC 这 3 种编译器&#xff0c;使用 CLion 编写程序&#xff0c;程序员可以根据需要随意切换使用的编译器。 第一步: 下载最新的 Clion 2023.1.5 版本安装包 我们先…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询&#xff1a; 1、查询医生…

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…