后端登录校验

文章目录

  • 登录校验
    • Cookie
    • Session
    • JWT
      • 生成JWT
      • 校验JWT
      • 基于JWT进行身份验证
      • CSRF
    • Cookie、Session、Token的区别?
    • 过滤器(Filter)
      • 配置过滤器
      • 过滤器链


登录校验

由于HTTP协议是无状态的,我们在进行登录后等一系列接口请求是无法直接区分是哪一个用户的发给服务器的请求,就需要用到会话技术来区分不同用户的请求,也可用来进行登录的校验(统一拦截),传统的会话技术有Cookie、Session,还有目前主流的Token。

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

Cookie

Cookie是HTTP支持的一种本地存储的机制,Cookie存放在客户端(浏览器),Cookie的值是一个字符串一般由程序员自己定义。当用户使用浏览器首次访问服务器的时候,响应头中就会带有一个Set-Cookie,这个Cookie的值就会被保存到浏览器中,后面用户的每一次请求都会带上这个Cookie。

在这里插入图片描述

由于Cookie存储空间有限(取决于浏览器具体的实现的,一般都不很大),因此Cookie一般能保存一些简单的信息,最典型的就是用户身份信息。

Cookie的缺点就是,上诉说的存储空间小,不够安全,因为Cookie是存放在本地浏览器中的,Cookie是可以被用户手动禁用的,移动端APP是无法使用Cookie的。

Session

Session是一种存在服务器上的会话技术,对比Cookie来说Session是相对安全一点的。一般Session是借助Cookie来传递身份标识(SessionID)的。在浏览器第一次访问服务器的时候,同样会通过Set-Cookie来将Session带上,并保存在浏览器的Cookie中,再后面的请求中都会带上这个SessionID,来区分不同浏览器。

而Session的缺点和Cookie类似,而且在分布式场景下会存在Session失效的问题。

禁用Cookie后Session还可以使用吗?

一般SessionId是借助Cookie来传递的,但如果Cookie被禁用了,就不知道直接使用Cookie传递SessionId了,有两种解决方式:

  1. 将SessionId放在每个请求的URL中传递,服务端再解析SessionId
  2. 将SessionId 放在表单中也就是请求体中传递给服务端

JWT

JWT全称JSON Web Token,JWT是一个字符串可以在请求头和响应头中直接传递,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

JWT由三个部分组成:

  • 第一部分:Header(头),记录了令牌的类型、签名算法等,如:

    {"alg": "HS256","typ": "JWT"
    }
    
  • 第二部分:Payload(有效载荷),携带一些自定义信息,默认信息等,如:

    {"sub": "1234567890","name": "John Doe","iat": 1516239022
    }
    
  • 第三部分:Signature(签名),防止Token被篡改,确保安全性,将header、payload,并加入指定密钥,通过指定签名算法计算而来。

在传递Token的时候,前两部分都会转换成base64格式的字符来进行传递,而第三部分则是通过指定的签名算法计算而来的,并不是base64格式的字符串。三个部分用点号分割,如图。

在这里插入图片描述

而由于数字签名的存在,整个JWT当中任何一个地方被篡改了,在校验的时候就会失败。

JWT的使用场景也是登录,在用户登录成功后生成一个token返回给前端,后续每个请求都会带上这个token。

优点:

  • 支持PC端和移动端
  • 支持跨域,JWT 包含了完整的认证和授权信息
  • 解决集群下的认证问题
  • 减轻服务端存储压力,传统的基于会话的认证机制需要服务器在会话中存储用户的状态信息,包括用户的登录状态、权限等。而使用 JWT,服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在 JWT 中

缺点:

需要自己实现

生成JWT

引入依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
@Test
public void testGenerateJwt() {Map<String,Object> claims = new HashMap<>();claims.put("id",1);claims.put("username","hhy");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256,"testToken")// 签名算法和签名密钥.setClaims(claims) // 自定义内容.setExpiration(new Date(System.currentTimeMillis() + 3600*1000))// 设置token有效时间为1h.compact();System.out.println(jwt);
}

校验JWT

@Test
public void testParseJwt() {Claims claims = Jwts.parser().setSigningKey("testToken") // 指定签名密钥.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNzA1ODA5NzQyLCJ1c2VybmFtZSI6ImhoeSJ9." +"-XMvQ0q0j7Ew49RZkae3Z0DpZ-a6d4O6Uw9sOi5ft-U")// 解析token.getBody();System.out.println(claims);
}

基于JWT进行身份验证

服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。而服务端收到这个JWT后就会先进行校验

CSRF

什么 Cookie 无法防止 CSRF 攻击,而 Token 可以?CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

  • 用户登录了网站a.com,并在Cookie中保存了SessionId
  • 接着黑客在test.com网站放置了诱导用户点击的链接,让用户访问了test.com
  • 而访问test.com的时候就会默认带上用户的登录后的SessionId
  • 这时用户访问黑客的页面,就让黑客拿到了用户的SessionId
  • 黑客就可以通过SessionId去伪造用户的请求给a.com发送请求

需要注意的是:黑客无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息

使用Token就可以防止CSRF,在我们登录成功后获得Token之后,一般会将这个Token存放在localStorage中,接着前端通过某些方式给每个发到后端的请求都加上这个Token,即使你用户点击了非法的链接发送请求到服务器,这个请求是不会携带Token的,所有这个请求是非法的。所以要想避免CSRF就可以使用Token,并将Token存储到本地存储中,而不是存储到Cookie中

Cookie、Session、Token的区别?

  1. 首先就是存储位置,Cookie是存储在浏览器的,而Session是存储在服务器上的,Token一般是以加密的方式存储在localStorage 中的
  2. Session一般是配合Cookie来进行使用的,通过响应头中的Set-Cookie来设置一个SessionId,这个Session一般保存在浏览器的Cookie中
  3. Session和Cookie默认是不能跨域的,而Token是可以跨域的,
  4. 因为Cookie是直接存储在浏览器中,所以不适合存储敏感数据,而Session存储在服务器中,相对来说更可靠一些,而Token是以指定的签名算法来进行加密后存储到浏览器中的

过滤器(Filter)

Filter过滤器,是JavaWeb三大组件之一(Servlet、Fiter、Listener)

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

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

配置过滤器

使用步骤:

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

  2. 配置Filter:Filter类上加上@WebFilter注解,配置拦截资源的路径。

    @WebFilter(urlPatterns = "/*") // 拦截所有请求
    public class MyFilter implements Filter {/*** 初始化执行一次* @param filterConfig* @throws ServletException*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 拦截到请求时,调用该方法,可以调用多次//放行前逻辑filterChain.doFilter(servletRequest,servletResponse);// 放行// 放行后逻辑}@Overridepublic void destroy() {// 销毁方法,服务器关闭时调用,值调用一次}
    }
    

    urlPatterns的值:

    • 拦截具体路径 /login
    • 目录拦截 /user/*
    • 拦截所有 /*
  3. 在启动类上加@ServletComponentScan开启Servlet组件支持,因为Filter是JavaWeb的组件,而不是Spring的

@ServletComponentScan
@SpringBootApplication
public class JwtApplication {public static void main(String[] args) {SpringApplication.run(JwtApplication.class, args);}
}

过滤器链

如果在项目中配置多个过滤器就形成了一个过滤器链,这些过滤器的执行顺序就是按照以类名按照字符串排序执行

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 使用定时任务(SpringTask)

Spring3.0以后自带的task&#xff0c;可以将它看成一个轻量级的Quartz&#xff0c;而且使用起来比Quartz简单许多。 使用步骤&#xff1a; 1.导入坐标 在spring-boot-starter-web坐标中&#xff0c;就包含了SpringTask&#xff0c;所以一般的Web项目都包含了。 <depende…

UE4 C++ 静态加载类和资源

静态加载类和资源&#xff1a;指在编译时加载&#xff0c;并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

ES6-对象的解构赋值

一、区别一下数组的解构赋值 - 对象的解构与数组有一个重要的不同。数组的元素是按次序排列的&#xff0c;变量的取值由它的位置决定&#xff1b;而对象的属性没有次序&#xff0c;变量必须与属性同名&#xff0c;才能取到正确的值二、说明 - 对象的解构赋值的内部机制&#…

共享网盘系统PHP源码

新V5.0版本&#xff0c;支持上传视频、支持视频播放、支持共享&#xff0c;也可以自己用。 可以自动生成视频外链&#xff0c;下载地址&#xff0c;播放器代码&#xff0c;html代码&#xff0c;ubb代码等等。 使用方法&#xff1a; 源码上传到服务器&#xff0c;打开网站根据…

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

云计算关键技术

目录 一、云计算关键技术概述 1.1 概述 二、关键技术内容 2.1 虚拟化技术 2.2 分布式数据存储技术 2.3 资源管理技术 2.4 云计算平台管理技术 2.5 多租户隔离技术 2.5.1 多租户技术下SaaS 特征 2.5.2 多租户技术面临的技术难题 2.5.2.1 数据隔离 2.5.2.2 客户化配置…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

前端登陆加密解决方案

项目背景 环食药烟草的数据下载模块中&#xff0c;需要判断用户在进行数据下载时是进行了登录操作&#xff0c;如果没有登录要跳转登陆页面&#xff0c;输入账号和密码进行登录。 使用场景 项目中需要前端书写登录页面&#xff0c;用户输入账号密码&#xff0c;前端获取到用…

嵌入式学习第十六天!(Linux文件查看、查找命令、标准IO)

Linux软件编程 1. Linux&#xff1a; 操作系统的内核&#xff1a; 1. 管理CPU 2. 管理内存 3. 管理硬件设备 4. 管理文件系统 5. 任务调度 2. Shell&#xff1a; 1. 保护Linux内核&#xff08;用户和Linux内核不直接操作&#xff0c;通过操作Shell&#xff0c;Shell和内核交互…

return语句

一、return语句 使用在方法时&#xff0c;表示跳出所在方法使用在main方法时&#xff0c;表示退出程序 二、break、continue、return三者的比较 break语句&#xff1a;跳出循环continue语&#xff1a;结束当次循环&#xff0c;继续下一次循环return语句&#xff1a;使用在方法时…

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…

Android学习之路(28) 进程保活组件的封装

前言 远古时代&#xff0c;出现过很多黑科技&#xff0c;比如MarsDaemon&#xff0c;使用双进程守护的方式进行保活&#xff0c;在当时可谓风光无限&#xff0c;可惜在8.0时代到来就被废弃了。 又比如后面出现的1像素Activity的保活方式&#xff0c;说他流氓一点不过分&#…

自动运维ansible实训(网络管理与维护综合实训)

来自即将退役学长的分享&#xff0c;祝学弟学妹以后发大财&#xff01; 一 实训目的及意义 1.1 实训目的 1、熟悉自动化运维工具&#xff1a;实训旨在让学员熟悉 Ansible 这一自动化运维工具。通过实际操作&#xff0c;学员可以了解 Ansible 的基本概念、工作原理和使用方法…

【数据结构】排序---C语言版

七大排序算法 一、对于排序的分类&#xff1a;二、插入排序1、直接插入排序&#xff08;1&#xff09;基本思想&#xff1a;&#xff08;2&#xff09;直接插入排序&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a;&#xff08;4&#xff09;总结&#xff1a; 2、希…

BAPI创建会计凭证和冲销凭证

目录 BAPI创建会计凭证和冲销凭证组件 利润中心冲销不可能原因由于一个变量为空导致不可以冲销 代码附上创建会计凭证代码冲销会计凭证代码 BAPI创建会计凭证和冲销凭证 在使用冲销会计凭证的BAPI&#xff0c;即BAPI_ACC_DOCUMENT_REV_POST时&#xff0c;遇到下面的问题&#…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

【数据库】关系型和非关系型数据库的区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 关系型数据库的优点 非关系型数据库&#xff08;NOSQL&#xff09;的优点 我的其他博客 正文 关系型数据库的优点 容易理解&#xff0c…

Python 数据可视化:配色方案

1、引言 在这篇文章中&#xff0c;我们将研究Python的一些配色方案&#xff0c;主要是Seaborn库。这将采用 Python Notebook 格式&#xff0c;其中包括绘图的代码。 2、实验数据 首先导入必要的库&#xff1a; import pandas as pd import seaborn as sns import matplotlib…

基于springboot篮球竞赛预约平台源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;篮球竞赛预约平台也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

虚幻UE 特效-Niagara特效实战-魔法阵

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他四篇实战&#xff1a;UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…