【JavaWeb】登录校验-会话技术(一)Cookie与Session

news2024/10/5 23:27:21

登录校验

实现登陆后才能访问后端系统页面,不登陆则跳转登陆页面进行登陆。

首先我们在宏观上先有一个认知:

HTTP协议是无状态协议。即每一次请求都是独立的,下一次请求并不会携带上一次请求的数据。
因此当我们通过浏览器访问登录后,接下来我们执行其他业务操作时,服务器无法判断用户是否登录。

那应该怎么来实现登录校验的操作呢?具体的实现思路可以分为两部分:

  1. 在登录成功后,需要将用户登录成功的信息存起来,记录用户已经登录成功的标记。
  2. 在浏览器发起请求时,需要在服务端进行统一拦截,拦截后进行登录校验。

如果在每一个功能中都添加判断逻辑就会出现相同代码逻辑,每个功能都需要编写,就会造成代码非常繁琐。
为了简化这块操作,我们可以使用:统一拦截技术

统一拦截技术:
拦截浏览器发送过来的所有请求,拦截后通过请求来获取之前所存入的登录标记。,以此判断是否放行。

我们要完成以上操作,会涉及到web开发中的两个技术:

  1. 会话技术
  2. 统一拦截技术
  • Servlet规范中的Filter过滤器
  • Spring提供的interceptor拦截器
    在这里插入图片描述

会话技术

什么是会话?

  • 浏览器与服务器之间的一次连接,我们就称为一次会话。
  • 用户打开浏览器,访问wb服务器的资源,会话建立,直到有一方断开连接,会话结束。
  • 在一次会话中可以包含多次请求和响应。

会话跟踪

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

为什么要共享数据呢?
由于HTTP是无状态协议,在后面请求中怎么拿到前一次请求生成的数据呢?此时就需要在一次会话的多次请求之间进行数据共享

会话跟踪技术有三种:

  1. Cookie(客户端会话跟踪技术)
    • 数据存储在客户端浏览器
  2. Session(服务端会话跟踪技术)
    • 数据存储在服务端
  3. 令牌技术
会话跟踪方案

在这里插入图片描述

方案一:Cookie

cookie 是客户端会话跟踪技术,它是存储在客户端浏览器的,我们使用 cookie 来跟踪会话,就可以在浏览器第一次发起请求来请求服务器的时候,我们在服务器端来设置一个cookie。
在 cookie 当中我们可以来存储用户相关的一些数据信息。比如当前登录用户的用户名,用户的ID。

服务器端在给客户端在响应数据的时候

  • 自动的将 cookie 响应给浏览器。
  • 浏览器接收到响应回来的 cookie 之后,会自动将 cookie 的值存储在浏览器本地。
  • 在后续的每一次请求当中,浏览器会自动将 cookie 携带到服务器端。

通过获取到的 cookie 值我们就可以判断当前用户是否登录。

为什么这一切都是自动化进行的?
因为 cookie 它是 HTTP 协议当中所支持的技术,而各大浏览器厂商都支持了这一标准。在 HTTP 协议官方给我们提供了一个响应头和请求头:

  • 响应头 Set-Cookie :设置Cookie数据
  • 请求头 Cookie:携带Cookie数据

代码演示

@Slf4j
@RestController
public class SessionController {

    //设置Cookie
    @GetMapping("/c1")
    public Result cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookie
        return Result.success();
    }
	
    //获取Cookie
    @GetMapping("/c2")
    public Result cookie2(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals("login_username")){
                System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie
            }
        }
        return Result.success();
    }
} 
  1. 访问c1接口,设置Cookie,http://localhost:8080/c1
    在这里插入图片描述

我们可以看到,设置的cookie,通过响应头Set-Cookie响应给浏览器,并且浏览器会将Cookie,存储在浏览器端。
在这里插入图片描述

  1. 访问c2接口 http://localhost:8080/c2,此时浏览器会自动的将Cookie携带到服务端,是通过请求头Cookie,携带的。
    在这里插入图片描述

优缺点

  • 优点:HTTP协议中支持的技术(像Set-Cookie 响应头的解析以及 Cookie 请求头数据的携带,都是浏览器自动进行的,是无需我们手动操作的)
  • 缺点:
    • 移动端APP(Android、IOS)中无法使用Cookie
    • 不安全,用户可以自己禁用Cookie
    • Cookie不能跨域

跨域介绍:
在这里插入图片描述

  • 现在的项目,大部分都是前后端分离的,前后端最终也会分开部署,前端部署在服务器 192.168.150.200 上,端口 80,后端部署在 192.168.150.100上,端口 8080
  • 我们打开浏览器直接访问前端工程,访问url:http://192.168.150.200/login.html
  • 然后在该页面发起请求到服务端,而服务端所在地址不再是localhost,而是服务器的IP地址192.168.150.100,假设访问接口地址为:http://192.168.150.100:8080/login
  • 那此时就存在跨域操作了,因为我们是在 http://192.168.150.200/login.html 这个页面上访问了http://192.168.150.100:8080/login 接口
  • 此时如果服务器设置了一个Cookie,这个Cookie是不能使用的,因为Cookie无法跨域

区分跨域的维度:

  • 协议
  • IP/协议
  • 端口
    只要上述的三个维度有任何一个维度不同,那就是跨域操作
示例是否跨域及原因
http://192.168.150.200/login.html ----------> https://192.168.150.200/login协议不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.100/loginIP不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.200:8080/login端口不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.200/login不跨域
方案二:Session

Session 的底层其实就是基于刚才所介绍的 Cookie 来实现的。

  • 获取Session
    在这里插入图片描述

    • 浏览器在第一次请求服务器的时候,我们就可以直接在服务器当中来获取到会话对象Session。
    • 如果是第一次请求Session ,会话对象是不存在的,这个时候服务器会自动的创建一个会话对象Session 。
    • 每一个会话对象Session ,它都有一个ID(示意图中Session后面括号中的1,就表示ID),我们称之为 Session 的ID。
  • 响应Cookie (JSESSIONID)
    在这里插入图片描述

    • 服务器端在给浏览器响应数据的时候,它会将 Session 的 ID 通过 Cookie 响应给浏览器。
    • 在响应头当中增加了一个 Set-Cookie 响应头。这个 Set-Cookie 响应头对应的值是cookie,cookie 的名字是固定的 JSESSIONID 代表的服务器端会话对象 Session 的 ID。
    • 浏览器会自动识别这个响应头,然后自动将Cookie存储在浏览器本地。
  • 查找Session
    在这里插入图片描述

    • 接下来,在后续的每一次请求当中,都会将 Cookie 的数据获取出来,并且携带到服务端。接下来服务器拿到JSESSIONID这个 Cookie 的值,也就是 Session 的ID。拿到 ID 之后,就会从众多的 Session 当中来找到当前请求对应的会话对象Session。

这样就可以通过 Session 会话对象在同一次会话的多次请求之间来共享数据了,这就是基于 Session 进行会话跟踪的流程。

代码演示

@Slf4j
@RestController
public class SessionController {

    @GetMapping("/s1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s1: {}", session.hashCode());

        session.setAttribute("loginUser", "tom"); //往session中存储数据
        return Result.success();
    }

    @GetMapping("/s2")
    public Result session2(HttpServletRequest request){
        HttpSession session = request.getSession();
        log.info("HttpSession-s2: {}", session.hashCode());

        Object loginUser = session.getAttribute("loginUser"); //从session中获取数据
        log.info("loginUser: {}", loginUser);
        return Result.success(loginUser);
    }
}
  1. 访问 s1 接口,http://localhost:8080/s1
    在这里插入图片描述

请求完成之后,在响应头中,就会看到有一个Set-Cookie的响应头,里面响应回来了一个Cookie,就是JSESSIONID,这个就是服务端会话对象 Session 的ID。

  1. 访问 s2 接口,http://localhost:8080/s2
    在这里插入图片描述

接下来,在后续的每次请求时,都会将Cookie的值,携带到服务端,服务端接收到Cookie之后,会自动的根据JSESSIONID的值,找到对应的会话对象Session。

那经过这两步测试,大家也会看到,在控制台中输出如下日志:
在这里插入图片描述

两次请求,获取到的Session会话对象的hashcode是一样的,就说明是同一个会话对象。而且,第一次请求时,往Session会话对象中存储的值,第二次请求时,也获取到了。 那这样,我们就可以通过Session会话对象,在同一个会话的多次请求之间来进行数据共享了。

优缺点

  • 优点:Session是存储在服务端的,安全
  • 缺点:
    • 服务器集群环境下无法直接使用Session
    • 移动端APP(Android、IOS)中无法使用Cookie
    • 用户可以自己禁用Cookie
    • Cookie不能跨域

PS:Session 底层是基于Cookie实现的会话跟踪,如果Cookie不可用,则该方案,也就失效了。

服务器集群环境为何无法使用Session?
在这里插入图片描述
首先第一点,我们现在所开发的项目,一般都不会只部署在一台服务器上,因为一台服务器会存在一个很大的问题,就是单点故障。所谓单点故障,指的就是一旦这台服务器挂了,整个应用都没法访问了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffd4ee2143a1477aaf51202a3712d06d.png#pic_center

  • 所以在现在的企业项目开发当中,最终部署的时候都是以集群的形式来进行部署,也就是同一个项目它会部署多份。
  • 而用户在访问的时候,他会访问一台前置的服务器,我们叫负载均衡服务器,它的作用就是将前端发起的请求均匀的分发给后面的这三台服务器。
    在这里插入图片描述此时假如我们通过 session 来进行会话跟踪,可能就会存在这样一个问题。
  • 用户打开浏览器要进行登录操作,此时会发起登录请求。登录请求到达负载均衡服务器,将这个请求转给了第一台 Tomcat 服务器。
  • 服务器接收到请求后,获取到会话对象session,然后给浏览器响应数据和携带一个cookie。
  • 此时,我们再执行一次操作,这次请求到达负载均衡服务器之后,负载均衡服务器将这次请求转给了第二台 Tomcat 服务器,此时他就要到第二台 Tomcat 服务器当中根据JSESSIONID 也就是对应的 session 的 ID 值,要找对应的 session 会话对象。
  • 显然,第二台服务器当中并没有这个ID的会话对象 Session。
    同一个浏览器发起了 2 次请求,结果获取到的不是同一个会话对象,这就是Session这种会话跟踪方案它的缺点,在服务器集群环境下无法直接使用Session。

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

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

相关文章

Cyuyan中的自定义类型——结构体

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、结构体基础知识(一)、结构体类型的声明、变量的创建与初始化(二)、结构成员访问操作符(三&#…

近红外光谱脑功能成像(fNIRS):1.光学原理、变量选取与预处理

一、朗伯-比尔定律与修正的朗伯-比尔定律 朗伯-比尔定律 是一个描述光通过溶液时被吸收的规律。想象你有一杯有色液体,比如一杯红茶。当你用一束光照射这杯液体时,光的一部分会被液体吸收,导致透过液体的光变弱。朗伯-比尔定律告诉我们&#…

如何在主动动态安全中使用人工智能驱动的威胁分类提高防御精准度

面对当今世界不断演变的网络威胁,人工智能和网络安全将会发挥重要的防护作用。在数据泄露和网络攻击日益突出的时代,人工智能和网络安全之间的合作成为数字安全战场上的强大盟友。 本文将深入研究这两个领域的融合,揭示它们在彻底改变威胁检测…

未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!

我们自幼接受的教育是,学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略,解放思想和改革开放必定会发生,和平和发展必定是世界的主题,中国经济必定是高速增长…… 然而,在真正的历史学家眼中,历史…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作? 在网络和互联网协议领域,有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具,它代表套接字安全版本 5。 在这篇博文中,我们将深入探讨 SOCKS5 的细节&…

实战项目——用Java实现图书管理系统

前言 首先既然是管理系统,那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类&am…

【后端面试题】【中间件】【NoSQL】MongoDB提高可用性的方案(主从结构、仲裁节点、分片、写入语义)

主从结构 MongoDB的高可用和别的中间件的高可用方案基本类似。比如在MySQL里,接触了分库分表和主从同步;在Redis里,Redis也有主从结构;在Kafka里,分区也是有主从结构的。 所以先介绍启用了主从同步 我们的系统有一个关…

【AIGC】DiffuToon:稳定的视频卡通化技术方案

论文:https://arxiv.org/pdf/2401.16224 github:https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/Diffutoon 网络结构 两个主要分支:主要的卡通化管线和编辑分支 重要技术 使用了fastblend(无需模型的视频帧之间的平滑…

巴图自动化Profinet协议转Modbus协议模块接称重模块与PLC通讯

巴图自动化Profinet协议转Modbus协议模块(BT-MDPN10)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Profinet协议转Modbus协议模块可提供单个或多个RS485接口,使得不同设备之间可以顺利进行通信,进一步提升了工业自动化…

IPFoxy Tips:为什么要选择动态住宅代理IP?

在大数据时代的背景下,代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性,而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

花两天手撸海纳嗨数数据分析系统,实现数据分析自给自足

我发现一款超好用的数据分析营销系统,且支持免费私有化部署。 机器准备 机器角色配置10.0.21.85主8核,12G,100G,Centos7.910.0.221.51辅8核,12G,100G,Centos7.910.0.221.55辅8核,12…

x86芯片定制,Ethercat芯片定制,适用于运动控制,工业总线等软硬一体机

x86芯片定制,Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验,对接您的产品规格场景需求,快速交付样机,包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

电影院售票管理系统(小白)大佬求解

最近在写一个关于电影院售票管理系统的sm项目,但是在买票的环节出现了问题及点击选座购票,没有数据渲染出来,我不知道什么情况,所以问问。有没有大佬可以帮我解决这个问题?下面是我的。控制层,服务层&#…

systemctl命令使用

systemctl 作用:可以控制软件(服务)的启动、关闭、开机自启动 系统内置服务均可被systemctl控制第三方软件,如果自动注册了可以被systemctl控制第三方软件,如果没有自动注册,可以手动注册 语法 systemct…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

生成式人工智能与虚拟资产成为BGOV 2024的焦点议题

香港,2024年7月2日 — 一年一度的创新科技盛事BUSINESS GOVirtual (BGOV) 科技博览及会议将于2024年7月11日至12日在香港会议展览中心隆重举行。 展览及会议焦点两大科技趋势:生成式人工智能 (Generative AI) 和虚拟资产 生成式人工智能( Generative A…

【CT】LeetCode手撕—199. 二叉树的右视图

目录 题目1- 思路2- 实现⭐199. 二叉树的右视图——题解思路 3- ACM 实现 题目 原题连接&#xff1a;199. 二叉树的右视图 1- 思路 使用二叉树的层序遍历 2- 实现 ⭐199. 二叉树的右视图——题解思路 class Solution {public List<Integer> rightSideView(TreeNode ro…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

用随机森林算法进行的一次故障预测

本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法&#xff0c;来训练一个硬盘故障预测模型&#xff0c;并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程&#xff1b;掌握使用pandas做数据分析的基本方法&#xff1b;掌握使用scikit-l…