JavaWeb(十一)

news2024/11/25 22:39:19

一、会话跟踪技术的概述

1.1、会话的概念

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

        从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了,会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着。浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为会话。

        用实际场景来理解下会话,比如在我们访问京东的时候,当打开浏览器进入京东首页后,浏览器和京东的服务器之间就建立了一次会话,后面的搜索商品,查看商品的详情,加入购物车等都是在这一次会话中完成。

        下图中一共建立了3次会话,每个浏览器都会与服务端建立一个会话,中间的第二次会话中,包含两次请求和响应

        

1.2、会话跟踪的概念

        服务器会收到多个请求,这多个请求可能来自多个浏览器,如上图中的6个请求来自3个浏览器。服务器需要用来识别请求是否来自同一个浏览器,服务器用来识别浏览器的过程,这个过程就是会话跟踪。服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据。

1.3 、会话跟踪在实际中的应用

        我们打开京东的网站,将商品加入购物车去购物车结算是两次请求,购物车结算的时候需要展示加入购物车的商品,就需要用到数据共享。

1.4、会话跟踪的实现

        浏览器和服务器之间使用的是HTTP请求来进行数据传输,HTTP协议是无状态的,HTTP协议设计成无状态的目的是让每次请求之间相互独立互不影响。所以每次浏览器向服务器请求时,服务器都会将该请求视为新的请求。所以现在浏览器和服务器不支持数据共享。

        为了解决浏览器和服务器不支持数据共享的问题,具体的实现方式有:Cookie(客户端会话跟踪技术)、Session(服务端会话跟踪技术)。

二、Cookie

2.1、Cookie的概念

 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

2.2、Cookie的案例

        服务端提供了两个Servlet,分别是ServletAServletB,浏览器发送HTTP请求1给服务端,服务端ServletA接收请求并进行业务处理。服务端ServletA在处理的过程中可以创建一个Cookie对象并将name=zs的数据存入Cookie,服务端ServletA在响应数据的时候,会把Cookie对象响应给浏览器。浏览器接收到响应数据,会把Cookie对象中的数据存储在浏览器内存中,此时浏览器和服务端就建立了一次会话。

         在同一次会话中浏览器再次发送HTTP请求2给服务端ServletB,浏览器会携带Cookie对象中的所有数据,ServletB接收到请求和数据后,就可以获取到存储在Cookie对象中的数据,这样同一个会话中的多次请求之间就实现了数据共享。

        

2.3、代码的实现 

2.3.1、创建Maven项目cookie-demo,并在pom.xml添加依赖
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
    <!--servlet-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!--jsp-->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    <!--jstl-->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
        </plugin>
    </plugins>
</build>
2.3.2、编写Servlet类,名称为AServlet

        在Servlet中创建Cookie对象,存入数据,发送给前端

@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1. 创建Cookie对象
        Cookie cookie = new Cookie("username","zs");
        //2. 发送Cookie,response
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
2.3.3、启动项目,并在页面访问:http://localhost:8080/cookie-demo/aServlet

在chrome浏览器通过开发者工具包查看Cookie的值

2.3.4、编写一个新Servlet类,名称为BServlet

在页面访问:http://localhost:8080/cookie-demo/bServlet

@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1. 获取Cookie数组
        Cookie[] cookies = request.getCookies();
        //2. 遍历数组
        for (Cookie cookie : cookies) {
            //3. 获取数据
            String name = cookie.getName();
            if("username".equals(name)){
                String value = cookie.getValue();
                System.out.println(name+":"+value);
                break;
            }
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

在IDEA控制台就能看到输出的结果:

2.3.5、Cookie的原理分析

        AServlet返回的响应数据是Cookie对象,当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据Set-Cookie:username=zs,

          

        浏览器获取到响应结果后,从响应头中就可以获取到Set-Cookie对应值username=zs,并将数据存储在浏览器的内存中。浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加Cookie: username=zs发送给服务端BServlet

 

三、Session

3.1、session的概念

服务端会话跟踪技术:将数据保存到服务端

3.2、通过session实现会话

        在服务端的AServlet获取一个Session对象,把数据存入其中。在服务端的BServlet获取到相同的Session对象,从中取出数据。就可以实现一次会话中多次请求之间的数据共享了

 

3.3、代码的实现

创建SessionDemo1:获取Session对象、存储数据

@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//存储到Session中
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 存储数据
        session.setAttribute("username","zs");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

创建SessionDemo2:获取Session对象、获取数据

@WebServlet("/demo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据,从session中
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 获取数据
        Object username = session.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

先访问http://localhost:8080/cookie-demo/demo1,将数据存入Session

再访问http://localhost:8080/cookie-demo/demo2,从Session中获取数据

查看控制台

通过案例的效果,能看到Session是能够在一次会话中两次请求之间共享数据。

3.4、session原理分析 

Session是基于Cookie实现的

1、通过浏览器访问 http://localhost:8080/cookie-demo/demo1时,demo1在第一次获取session对象的时候,session对象会有一个唯一的标识,假如是id:10 ,demo1在session中存入其他数据并处理完成所有业务后,需要通过Tomcat服务器响应结果给浏览器。浏览器接收到响应结果后,会把响应头中的coookie数据存储到浏览器的内存中。

2、浏览器在同一会话中访问demo2的时候,会把cookie中的数据按照cookie: JESSIONID=10的格式添加到请求头中并发送给服务器Tomcat

 

3、demo2获取到请求后,从请求头中读取cookie中的JSESSIONID值为10,然后就会到服务器内存中寻找id:10的session对象,如果找到了,就直接返回该对象,如果没有则新创建一个session对象 。

总结:浏览器会把存入数据的session的id当做cookie存到响应头中,在同一次会话时,会把这个cookie添加到请求头,发送第二次请求时,会携带这个cookie,服务器通过session的id找到对应的session,然后从session中取出相应的值。

之所以说session是基于cookie实现的,因为session的id是当做cookie进行存储的。

四、 cookie和session的区别

1、Session是存储在服务端而Cookie是存储在客户端

2、存储在客户端的数据容易被窃取和截获,存在很多不安全的因素

3、存储在服务端的数据相比于客户端来说就更安全

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

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

相关文章

工业主板和消费主板的区别

消费类主板是用于家庭和个人计算机的批量生产的通用主板。另一方面&#xff0c;工业主板则用于工厂、制造设备、医疗设备、公共基础设施以及其他重视可靠性的场所。 工业主板的特点 工业主板有以下四个主要特点。 长期稳定供应 高可靠性 耐环境性 可定制 工业应用需要主…

044:vue中引用json数据的方法

第044个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

在vscode下将ipynb文件转成markdown(.md文件)的方法

在vscode下将ipynb文件转成markdown&#xff08;.md文件&#xff09;的方法 写在最前面安装nbconvert工具vscode界面 or cmd终端基本命令将ipynb文件转换成md文件 总结 写在最前面 VSCode作为一款强大的代码编辑器&#xff0c;提供了广泛的功能。它支持多种文件格式的编辑和查…

387.字符串中的第一个唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

promethesu告警规则配置,alertmanager通过webhook通知

文章目录 前言一、promethesu告警二、告警配置编写rule文件prometheus配置prometheus产生告警 三、告警通知prometheus 配置 alertmanageralertmanager 配置 webhook通知编写接口接收 webhook 总结 前言 如果没有学习过prometheus的基础和监控的同学&#xff0c;可以先过一遍这…

C/C++端口复用SO_REUSEADDR(setsockopt参数),test ok

端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用&#xff0c;则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用&#xff0c;绑定会失败&#xff0c;提示ADDR已经在使用中——…

StoneDB-8.0-V2.2.0 企业版正式发布!性能优化,稳定性提升,持续公测中!

​ 11月&#xff0c;StoneDB 新版本如期而至&#xff0c;这一个月来我们的研发同学加班加点&#xff0c;持续迭代&#xff1a;在 2.2.0 版本中&#xff0c;我们针对用户提出的需求和做出了重量级更新&#xff0c;修复了一些已知和用户反馈的 Bug&#xff0c;同时对部分代码进行…

docker学习(四、修改容器创建新的镜像推送到云上)

镜像是只读的&#xff0c;容器是可编辑的。Docker镜像是分层的&#xff0c;支持通过扩展镜像&#xff0c;创建新的镜像。 学到这里感觉docker跟git很想~~ 通过docker commit将修改的容器做成新的镜像 # 将容器做成新的镜像 docker commit -m"提交备注" -a"作…

结构化布线系统

满足下列需求&#xff1a; 1.标准化&#xff1a;国际、国家标准。 2.实用性&#xff1a;针对实际应用的需要和特点来建设系统。 3.先进性&#xff1a;采用国际最新技术。5-10年内技术不落后。 4.开放性&#xff1a;整个系统的开放性。 5.结构化、层次化&#xff1a;易于管理和维…

Nginx+Promtail+Loki+Grafana 升级ELK强大工具

最近客户有个新需求,就是想查看网站的访问情况,由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的页面,咱也做不到 成熟的日志解决方案,那就是ELK,还有现在比较火的Loki,(当然还有很多其…

WPF使用WebBrowser报脚本错误问题处理

前言 WPF使用WebBrowser报脚本错误问题处理,我们都知道WPF自带的WebBrowser都用的IE内核,但是在特殊的条件下我们还需要用到它,比如展示纯html简单的页面。再展示主流页面的时候比如用到Jquery高级库或者VUE等当前主流站点时经常就会报JS脚本错误,在Winform里面我们一句代…

进程、线程、线程池状态

线程几种状态和状态转换 进程主要写明三种基本状态&#xff1a; 线程池的几种状态&#xff1a;

这是最后的战役了

不变因子 初等因子 行列式因子 smith标准型 酉矩阵 H-阵等等 A H A A^H A AHA 就是 H-阵 正定H阵的性质 若 A A A 为正定的H-阵. 存在可逆矩阵 Q Q Q&#xff0c; 使得 A Q H Q AQ^H Q AQHQ.存在 P P P, 使得 P H A P I P^HAPI PHAPI.A的特征值大于0. Q − 1 A Q Q^{…

生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;本来是想在Milkv-duo上跑rtthread的&#xff0c;做了很多努力&#xff0c;一直没有结果。虽然不知道最终能不能成功做出来&#xff0c;还是把自己的相关努力分享出来…

RocketMQ安装和使用

RocketMQ快速入门 下载RocketMQ 下载地址 环境要求 Linux64位系统 JDK1.8(64位) 安装RocketMQ 解压 unzip rocketmq-all-4.4.0-bin-release.zip启动RocketMQ 启动NameServer # 1.启动NameServer nohup sh bin/mqnamesrv & # 2.查看启动日志 tail -f ~/logs/rocke…

用C语言实现队列的顺序结构

用C语言实现队列的初始化、队列的判空操作、入队操作、出队运算、取队头元素运算、顺序打印队列。 #include<stdio.h> #define QueueSize 100 typedef char ElemType; typedef struct//队列结构体 {ElemType data[QueueSize];//保存队中元素int front, rear;//队头和队尾…

hook其他调试技巧

输出堆栈信息 通过 android.util.Log 输出当前线程的堆栈跟踪信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

判断css文字发生了截断,增加悬浮提示

示例&#xff1a; 固定显示宽度&#xff0c;溢出显示...&#xff0c;利用了css的属性&#xff0c;想要实现成下面这样&#xff1a; 针对溢出的文字&#xff0c;hover显示全部。 提示很好加&#xff0c;使用tooltip组件就行了&#xff0c;难点是如何判断是否发生了文字溢出。…

【从零认识ECS云服务器 | 快速上线个人网站】三、对外发布网站

3.1 配置域名 用户是如何访问网站的呢&#xff1f; 用户在浏览器(IE、Chrome、FireFox等)上输入域名&#xff0c;如&#xff1a;http://www.aliyun.com &#xff1b; 浏览器自动调用DNS&#xff08;域名服务&#xff09;将域名解析为IP地址&#xff0c;如&#xff1a;123.123…

canvas绘制运动的圆

代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…