后端登录校验

文章目录

  • 登录校验
    • 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
         */
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // 拦截到请求时,调用该方法,可以调用多次
            //放行前逻辑
            filterChain.doFilter(servletRequest,servletResponse);// 放行
            // 放行后逻辑
        }
    
        @Override
        public 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);
    }
}

过滤器链

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

在这里插入图片描述


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

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

相关文章

电路设计(10)——超温报警电路的proteus仿真

1.题目背景 在现实生活中&#xff0c;常有一种工程技术&#xff0c;即带有自动温度补偿的设备&#xff0c;能在规定温度内正常工作。但是为了设备安全&#xff0c;需设定工作的上限温度&#xff0c;万一温控补偿失效&#xff0c;设备温度一旦超出上限温度时&#xff0c;便立即切…

ES高可用架构涉及常用功能整理

ES高可用架构涉及常用功能整理 1. es的高可用系统架构和相关组件2. es的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 数据分片按ip打散2.2.2 数据分片机架感知2.2.3 强制要求数据分片机架感知2.2.4 写入线程池优化2.2.5 分片balance优化2.2.6 限流控制器优化 3. es常用命令3.1 …

项目中将sass更换成less(TypeError: this.getOptions is not a function已解决)

在更换之前&#xff0c;首先了解sass与less在用法上的区别有哪些&#xff08;这里简单提几个&#xff09;&#xff1a; 变量区别&#xff1a;Less中用&#xff0c;Sass用$sass支持条件语句&#xff0c;可以使用if{}else{}、for循环等&#xff0c;而less不支持在定义变量时候&a…

PyTorch 2.2 中文官方教程(十八)

开始使用完全分片数据并行&#xff08;FSDP&#xff09; 原文&#xff1a;pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Hamid Shojanazeri&#xff0c;Yanli Zhao&#xff0c;Shen Li 注意…

如何获取和查找您的Android设备的序列号

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;&#xff0c;我们经常会在文章中提及到各种各样的Android设备&#xff0c;而其中一个重要的标识就是设备的序列号。设备的序列号在很多情况下被用于唯一标识一个设备&#xff0c;例如在软件开发中进行设备的调试和测试&#xf…

Python统计分析——参数估计

参考资料&#xff1a;用python动手学统计学 所谓参数就是总体分布的参数。 1、导入库 # 导入用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入用于绘图的库 from matplotlib import pyplot as plt import seabor…

FL Studio Producer Edition 21.2.2全插件版+Crack下载链接(亲测可用,非钓鱼)

不知道为什么现在钓鱼的这么多&#xff08;有答案的请在评论区上告诉我&#xff09;&#xff0c;就一个学习版的编曲软件有必要这样子搞吗&#xff1f;我也是在各类博客上找了一大堆教程&#xff0c;根本没几个能用的&#xff0c;索性直接到海盗湾上找了一个&#xff0c;发现可…

学习ArtTs -- 初见ArkTs

作者&#xff1a;Uncle_Tom 原文链接&#xff1a;学习ArtTs -- 初见ArkTs-云社区-华为云 1. 前言 需要静态分析去检查一个语言&#xff0c;必须对这个语言有深刻的认识&#xff0c;才能有效的对这个语言进行有效的检查。 我常说:“作为一个程序分析员需要比一般的程序员考虑…

移动端基础-vw适配

什么是vw 相对单位 相对视口的尺寸 vw:viewport width 换算 1vw1/100视口宽度 vw不需要向rem一样检查视口宽度 若视口宽为375px 1vw3.75px vw与vmin的区别 vmin更照顾横竖屏问题 1vw是视口宽度的100%&#xff0c;而vmin是找宽度和高度中最小的那个&#xff0c;这样横屏…

Ansible自动化工具(1)

目录 ansible的特性&#xff1a;. 二.部署ansible 管理端安装 ansible&#xff1a; ansible 目录结构&#xff1a; 管理主机上配置主机清单&#xff1a; ​编辑 配置密钥对验证&#xff1a; ansible 命令行模块 &#xff1a; 1&#xff0e;command 模块 指定 ip 执行…

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查

Python使用zdppy_es国产框架操作Elasticsearch实现增删改查 本套教程配套有录播课程和私教课程&#xff0c;欢迎私信我。 Docker部署ElasticSearch7 创建基本容器 docker run -itd --name elasticsearch -p 9200:9200 -e "discovery.typesingle-node" -e ES_JAVA_…

esp8266 步骤

安装驱动 http://arduino.esp8266.com/stable/package_esp8266com_index.json oled库 esp8266-oled-ssd1306

网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署&#xff0c;熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置&#xff0c;提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练&#xff0c;着重锻炼学生熟练…

网站不收录,与服务器不备案有关吗

随着互联网的快速发展&#xff0c;网站已经成为企业、个人和机构宣传和展示自己的重要平台。然而&#xff0c;许多网站在建设完成后却面临着不收录的问题&#xff0c;这给网站的管理者和拥有者带来了很大的困扰。其中&#xff0c;一些人认为&#xff0c;网站不收录的原因与服务…

什么是前端工程化,请举例说明

前端工程化 前端工程化的定义为什么需要前端工程化前端工程化的核心概念 模块化开发&#xff1a;组件化开发&#xff1a;规范化开发&#xff1a;自动化开发&#xff1a;持续集成 前端工程化的主要工具前端工程化的应用总结&#xff1a; 前端工程化 前端工程化的定义 前端工程…

百面嵌入式专栏(面试题)华为面试题

文章目录 题目:static有什么用途?(请至少说明两种)题目:引用与指针有什么区别?题目:描述实时系统的基本特性题目:全局变量和局部变量在内存中是否有区别?如果有,是什么区别?题目:什么是平衡二叉树?题目:堆栈溢出一般是由什么原因导致的?题目:什么函数不能声明为…

2020年通信工程师初级专业实务真题

文章目录 一、第1章 现代通信网概述&#xff1a;信令网、同步网、管理网。第10章 通信业务&#xff1a;通信产业链&#xff0c;通信终端的分类&#xff0c;通信业务的定义及分类二、第3章 接入网&#xff1a;无线接入网的优点&#xff0c;接入网的接口&#xff08;UNI&#xff…

2024 Google Chrome 浏览器回退安装旧版本

2024 Google Chrome 浏览器回退安装旧版本 查看当前谷歌版本备份浏览器数据卸载浏览器双击重新安装旧版本浏览器 查看当前谷歌版本 详细参考&#xff1a;参考 笔记&#xff1a;最近谷歌浏览器更新后&#xff0c;用着总感觉别扭&#xff1a;不习惯 备份浏览器数据 &#xff…

【自然语言处理】P4 神经网络基础 - 激活函数

目录 激活函数SigmoidTanhReLUSoftmax 本节博文介绍四大激活函数&#xff0c;Sigmoid、Tanh、ReLU、Softmax。 激活函数 为什么深度学习需要激活函数&#xff1f; 博主认为&#xff0c;最重要的是 引入非线性。 神经网络是将众多神经元相互连接形成的网络。如果神经元没有激…

【Spring】Spring 启示录

一、OCP 开闭原则 核⼼&#xff1a;在扩展系统功能时不需要修改原先写好的代码&#xff0c;就是符合OCP原则的&#xff0c;反之修改了原先写好的代码&#xff0c;则违背了OCP原则的 若在扩展系统功能时修改原先稳定运⾏程序&#xff0c;原先的所有程序都需要进⾏重新测试&…