首页 > 其他分享 >会话技术(1)Cookie

会话技术(1)Cookie

时间:2024-03-17 13:29:06浏览次数:19  
标签:浏览器 请求 技术 value 会话 Cookie cookie

目录

1、会话是什么

2、会话跟踪是什么

3、HTTP协议不提供会话跟踪

4、会话跟踪的实现方式

5、客户端会话跟踪技术 Cookie

1)怎样使用

2)原理


1、会话是什么

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

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

举例:

打开浏览器进入购物网站的首页后,浏览器与购物网站就建立了一次会话,后面的搜索商品、查看商品的详情、加入购物车等都是在这一次会话中完成的。如果打开多个浏览器访问这个网站,每个浏览器都会与服务端建立了一个会话。

2、会话跟踪是什么

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

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

应用场景举例:

购物车:加入购物车和去购物车结算是两次请求,但是后一次请求需要展示前一次请求所添加的商品,就要用到数据共享。

页面展示用户登录信息:登录网站后,在发出不同请求访问不同功能时,都会展示当前登录用户的信息,如用户名。

登录页面的“记住我”功能:用户登录时,勾选“记住我”按钮,登录成功后,下次再登录时,网站就会自动填充用户名和密码,简化用户的登录操作。多次登录就会有多次请求,他们之间涉及到共享数据。

登录页面的验证码功能:生成验证码、输入验证码点击注册是两次请求,这两次请求的数据之间要进行对比,相同则允许注册,不同则拒绝注册,该功能的实现需要在同一次会话中共享数据。

3、HTTP协议不提供会话跟踪

浏览器和服务器之间使用HTTP进行数据传输,而HTTP协议是无状态的。每次浏览器发出请求,服务器都会将该请求视为新的请求(HTTP协议设计成无状态的目的是让每次请求之间相互独立、互不影响),所以无法实现多次请求之间的数据共享。

4、会话跟踪的实现方式

最常见的是使用Cookie和Session,其他还有Token认证、OAuth等。

5、客户端会话跟踪技术 Cookie

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

Cookie以键值对的形式存在,当用户第一次请求服务时,Cookie信息会随着服务器端的响应发送给客户端浏览器,然后客户端浏览器会把Cookie保存起来,当下一次客户端发起请求时携带此信息作为用户的唯一标识发送给服务器。

比如,服务端提供了两个Servlet,分别是ServletA和ServletB:
浏览器发送HTTP请求1给服务端,服务端ServletA接收请求并进行业务处理,在处理时创建了一个Cookie对象并将 name=Tom 的数据存入Cookie。服务端ServletA在响应数据的时候,会把Cookie对象响应给浏览器。
浏览器接收到响应数据,会把Cookie对象中的数据存储在浏览器内存中,此时浏览器和服务端就建立了一次会话。
在同一次会话中浏览器再次发送HTTP请求2给服务端ServletB,浏览器会携带Cookie对象中的所有数据。ServletB接收到请求和数据后,就可以获取到存储在Cookie对象中的数据,这样同一个会话中的多次请求之间就实现了数据共享。

1)怎样使用

发送Cookie:
        创建Cookie对象,并设置值:Cookie cookie = new Cookie("key","value");
        使用Reponse对象发送Cookie到客户端:response.addCookie(cookie);

        设置Cookie有效期(可选,默认浏览器关闭即销毁):cookie.setMaxAge(int seconds)

获取Cookie:
        使用Request对象获取Cookie数组:Cookie[ ] cookies = request.getCookies();
        遍历数组,获取数组中每个Cookie对象的值:cookie.getName()、cookie.getValue()

应用举例:设置 "username","Tom" 到 Cookie  并获取:

步骤一:存入Cookie

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

@WebServlet("/cookieServlet")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1. 创建Cookie对象
        Cookie cookie = new Cookie("username","Tom");
        //2. 设置Cookie的有效期(可选)  
    cookie.setMaxAge(60*60*24*7); // 有效期为1周
        //3. 将Cookie添加到响应中  
        response.addCookie(cookie);
    }

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

启动,访问  http://localhost:8080/understandTomcat/CookieServlet,

在浏览器打开开发者工具-Applications-Cookies中查看。

步骤二:获取Cookie

@WebServlet("/cookieServlet2")
public class CookieServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1. 获取Cookie数组
        Cookie[] cookies = request.getCookies();
        //2. 遍历数组,查找名为"username"的Cookie  
        for (Cookie cookie : cookies) {
            //获取数据
            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);
    }
}

启动,访问 http://localhost:8080/understandTomcat/CookieServlet2 在控制台打印出获取的值。

username:Tom


怎样用Cookie存储中文:使用URL编码与解码

应用举例:

ServletA  编码:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.发送Cookie
        String value = "张三";
            //对中文进行URL编码
        value = URLEncoder.encode(value, "UTF-8");
        System.out.println("存储数据:"+value);
        //将编码后的值存入Cookie中
        Cookie cookie = new Cookie("username",value);
        //2. 将Cookie添加到响应中
        response.addCookie(cookie);
    }

ServletB 解码:

@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();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
                //URL解码
                value = URLDecoder.decode(value,"UTF-8");
                System.out.println(name+":"+value);//value解码后为 张三
                break;
            }
        }

2)原理

ServletA给客户端发送Cookie、ServletB从Request对象中获取Cookie,在这个过程中:

Tomcat服务器是基于HTTP协议来响应的,当ServletA响应数据时,如果Tomcat发现后端要返回的是一个Cookie对象,Tomcat就会在HTTP的响应头中添加一行数据:

Set-Cookie:username=Tom 

浏览器获取到响应结果后,从响应头中就可以获取到 Set-Cookie 对应值 username=Tom 并将数据存储在浏览器的内存中。

当浏览器再次发送请求给ServletB时,浏览器会自动在请求头中添加:  

Cookie: username=Tom 发送给服务端ServletB。

Request对象会把请求头中Cookie对应的值封装成一个或多个Cookie对象,形成一个数组。ServletB通过Request对象获取Cookie数组,从而获取到自己需要的数据。

浏览器打开开发者工具可以在请求头的中查看。

标签:浏览器,请求,技术,value,会话,Cookie,cookie
From: https://blog.csdn.net/u010852547/article/details/136512746

相关文章

  • 标题:智能语音助手技术文档
    标题:智能语音助手技术文档摘要:本文介绍了一种基于自然语言处理和机器学习技术的智能语音助手。该语音助手可以通过语音指令与用户进行交互,并实现各种功能,如语音搜索、日程安排、天气查询等,为用户提供了便捷的智能化服务。引言:智能语音助手是一种基于人工智能技术的新型......
  • java核心技术卷1 第五章:继承
    学习重要的是出,而不是入,此前一直埋头向前学,忽视了复习的重要性。写一个博客作为自己的学习笔记,也可作为以后查漏补缺的资料,温故而知新。类,超类和子类一个继承另一个类,父类也称为超类,基类。"超类"中的超来自于集合理论,指的是父类,与之后的super关键字对应java中,类的继承默认为pu......
  • 图解I/O中的零拷贝技术
    什么是零拷贝?        零拷贝是一种计算机系统中的I/O优化技术,它的核心思想是在数据传输过程中尽可能地减少或完全避免CPU将数据从一个存储区域复制到另一个存储区域的操作,从而减少了上下文切换和CPU拷贝时间,提高了系统的性能和效率。在Java领域,诸如Netty、Ka......
  • Docker与containerd:容器技术的双璧
    ......
  • WiFi的WPA3安全技术
    WiFi安全加密的演进下图所示,当前最新的加密方式是WPA3。WPA3对现有网络提供了全方位的安全防护,增强了公共网络、家庭网络和802.1X企业网的安全性。 WPA3的核心为对等实体同时验证方式(SimultaneousAuthenticationofEquals,SAE),即通信双方利用本地私钥和对方传输的公钥......
  • “成像光谱遥感技术中的AI革命:ChatGPT应用指南“
    遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能在解释复杂数据、提供见解和帮助决策过......
  • 数据爬取与可视化技术——urllib、XPath、lxml案例爬取新浪股票吧
    shy:数据爬取与可视化技术系列已发文三篇了,更多爬虫技术请查看专栏文章。数据爬取与可视化技术——使用urllib库爬取网页获取数据数据爬取与可视化技术——使用XPath和lxml库爬取、解析、提取数据shy:现已开辟专栏四个:C++、ACM、数据库系统概论、数据爬取与可视化技术,更多......
  • 网络安全等级保护2.0自查表 | 技术部分
    等保2.0自查表,技术部分,参考标准:GB∕T22239-2019《信息安全技术网络安全等级保护基本要求》GB∕T28448-2019《信息安全技术网络安全等级保护测评要求》等保2.0自查表技术部分范围控制点检查项三级要求二级要求安全物理环境物理位置选择a)机房场地应......
  • 基本技术指标 Python 实现
    布林带SharpCharts计算*MiddleBand=20-daysimplemovingaverage(SMA)*UpperBand=20-daySMA+(20-daystandarddeviationofpricex2)*LowerBand=20-daySMA-(20-daystandarddeviationofpricex2)点击这里下载此电子表格示例。")布林......
  • 实时数据传输的新里程——Server-Sent Events(SSE)消息推送技术
    目录一、背景介绍二、SSE场景案例三、工作原理    3.1SSE工作流程    3.2工作原理一、背景介绍    传统的请求模型是客户端发送一个请求到服务端,然后服务端做相应的处理,然后再将结果返回给客户端,这种“一问一答”的方式随着时间的推移并不......