JavaWeb-登录校验

会话技术

浏览器使用的是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环境中的资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05—js对象

一、初识对象 JavaScript是面向对象编程(Object Oriented Programming,OOP)语言。 面对象是一种复合值:它将很多值集合在一起,可通过名字访问这些值。对象也可看做一种无序的数据集合,由若干个“键值对”…

iced 入门一

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Jav…

基于ssm的企业在线培训系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装企业在线培训系统软件来发挥其高效地信息处理的作用&#x…

每日一题

腐烂的苹果_牛客题霸_牛客网 思路分析:广度优先遍历,找到所有腐烂的苹果同时向四方扩散,就是第一轮把所有腐烂的苹果加入队列中,这就跟MQ的消息队列的原理差不多,第一次记录队列的长度,广度遍历一次,长度--…

第一个STM32F767IGT6核心板

一. 制作原因 起先是因为参加计算机设计大赛准备的板子,其作用是连接OV5640摄像头来识别车牌号,主要外设有摄像头,SDRAM,网口等。 二. 原理图和PCB 原理图 PCB 三. 测试 1. 测试SDRAM功能 按下按键我们可以在串口中看到内存…

【基础IO】谈谈动静态库(怒肝7000字)

文章目录 前言实验代码样例静态库生成一个静态库归档工具ar静态库的链接 动态库创建动态库加载动态库 动静态链接静态链接动态链接动静态链接的优缺点 前言 在软件开发中,库(Library)是一种方式,可以将代码打包成可重用的格式&…

【C语言】内存函数-memcpy-memmove-memset...用法及实现,沉淀自己!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. memcpy函数使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy函数使用和模拟实现 <string.h>-------…

机器学习理论基础—神经网络算法公式学习

机器学习理论基础—神经网络公式学习 M-P神经元 M-P神经元&#xff08;一个用来模拟生物行为的数学模型&#xff09;&#xff1a;接收n个输入(通常是来自其他神经 元)&#xff0c;并给各个输入赋予权重计算加权和&#xff0c;然后和自身特有的阈值进行比较 (作减法&#xff0…

pytorch-MNIST测试实战

这里写目录标题 1. 为什么test2. 如何做test3. 什么时候做test4. 完整代码 1. 为什么test 如下图&#xff1a;上下两幅图中蓝色分别表示train的accuracy和loss&#xff0c;黄色表示test的accuracy和loss&#xff0c;如果单纯看train的accuracy和loss曲线就会认为模型已经train…

【优质书籍推荐】Vue.js+Node.js全栈开发实战

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

von Mises-Fisher Distribution (代码解析)

torch.distribution 中包含了很多概率分布的实现&#xff0c;本文首先通过均匀分布来说明 Distribution 的具体用法, 然后再解释 von Mises-Fisher 分布的实现, 其公式推导见 von Mises-Fisher Distribution. 1. torch.distribution.Distribution 以下是 Uniform 的源码: cl…

怎么使用JMeter进行性能测试?

一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具&#xff0c;完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量&#xff0c;最初设计用于web应用程序&#xff0c;现在已经扩展到其他测试功能&#xff0c;比如&#xff1a;FTP、Database和LDAP等。…

Vue 3 项目构建与效率提升:vite-plugin-vue-setup-extend 插件应用指南

一、Vue3项目创建 前提是已安装Node.js&#xff08;点击跳转Node官网&#xff09; npm create vuelatest这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ Projec…

跟着Carl大佬学leetcode之977 有序数组的平方

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…

electron打包dist为可执行程序后记【electron-quick-start】

文章目录 目录 文章目录 前言 一、直接看效果 二、实现步骤 1.准备dist文件夹 2.NVM管理node版本 3.准备electron容器并npm run start 4.封装成可执行程序 1.手动下载electron对应版本的zip文件&#xff0c;解决打包缓慢问题 2.安装packager 3.配置打包命令执行内容…

【点云语义分割】弱监督点云语义分割自适应标签分布

Adaptive Annotation Distribution for Weakly Supervised Point Cloud Semantic Segmentation 摘要&#xff1a; 弱监督点云语义分割因其能够减轻对点云细粒度注释的严重依赖而备受关注。然而&#xff0c;在实际应用中&#xff0c;稀疏注释通常在点云中呈现出明显的非均匀分布…

Table表格(关于个人介绍与图片)

展开行&#xff1a; <el-table :data"gainData" :border"gainParentBorder" style"width: 100%"><el-table-column type"expand"><template #default"props"><div m"4"><h3>工作经…

封装个js分页插件

// 分页插件类 class PaginationPlugin {constructor(fetchDataURL, options {}) {this.fetchDataURL fetchDataURL;this.options {containerId: options.containerId || paginationContainer,dataSizeAttr: options.dataSizeAttr || toatalsize, // 修改为实际API返回的数据…

Flutter 的 showDialog 和 showCupertinoDialog 有什么区别?

我将我的 App 里用的 Flutter 升级到了 3.19&#xff0c;没想到&#xff0c;以前我用 showDialog 和 AlertDialog 组合创建的二次确认框&#xff0c;变得无敌难看了&#xff0c;大幅度增加了整个框的圆角和里面默认按钮的圆角。不得已&#xff0c;我必须修改一下&#xff0c;以…

51.基于SpringBoot + Vue实现的前后端分离-校园志愿者管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的校园志愿者管理系统设计与实现管理工…