• 会话技术——cookie



    前言

    本文简单的介绍了Cookie会话技术的相关知识点,适合初学者入门


    一、状态管理Cookie会话技术(客户端)

    1.1 状态管理概述

    1.1.1 为什么需要状态管理?

    • Web应用程序使用HTTP协议通信,而HTTP协议是”无状态”协议,即服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的下一次请求将重新建立网络连接。
    • 服务器应用程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品。因此,有必要跟踪同一个客户发出的一系列请求。

    1.1.2 什么是状态管理?

    什么是状态管理

    • 将客户端((浏览器)与服务器之间多次交互(一次请求,—次响应)当做一个整体来看待,并且将多次交互所涉及的数据即状态保存下来。
      • 状态指的是数据
      • 管理指的是多次交互时对数据的修改

    1.1.3 状态管理的两种常见模式(Cookie与Session)

    1、客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。

    2、服务器状态管理技术:将状态保存在服务器端。代表性的是Session技术。

    1.2 Cookie(面试)会话技术

    会话技术

    1. 会话:一次会话中包含多次请求和响应。
      • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
      • 功能:在一次会话的范围内的多次请求间,共享数据

    1.2.1 什么是Cookie?(可以跟重定向对比一下)

    • 浏览器向Web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来。
    • 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。

    1.2.2 Cookie的原理

    • 我们写了两个Demo,在tomcat中运行,相当于这两个Demo在服务器中
    • 我们通过浏览器输入Demo1(发送cookie)的地址来发送请求,此时服务器作出响应,并发送了一个set-cookie(响应消息头里)
    • 此时浏览器获取到了服务器的内容(因为服务器会给浏览器一个响应)
    • 我们再在浏览器中输入Demo2的地址和请求消息头,服务器根据消息头和地址找到对应的资源,并响应给客户端。
      在这里插入图片描述

    1.2.3 如何创建Cookie

    1. 创建cookie对象,绑定数据。
    2. 发送Cookie对象。
    3. 获取cookie,拿到数据。
    • Servlet API为使用Cookie提供了javax.servlet.http.Cookie。
    • 创建格式
    Cookie c = new Cookie(String name,String value);
    		response.addCookie(c);
    
    • 1
    • 2

    name :用于区分不同Cookie的名字。
    value :Cookie的值。

    简单示例:

    Cookie c = new Cookie("welcome","welcome to zhongshan");
    		response.addCookie(c);
    
    • 1
    • 2

    1.2.4 如何查询Cookie

    • 获取客户端的所有Cookie对象∶
    Cookie[] cookies = request.getCookies();//此方法有可能返回NULL
    
    • 1
    • 取一个Cookie对象的名称或值:
    for(Cookie c:cookies){
    			System.out.println(c.getName()+":"+c.getValue());
    		}
    
    • 1
    • 2
    • 3

    1.2.5 如何修改Cookie

    step1,获取客户端发送的所有Cookie。
    step2,根据name找到要修改的Cookie。
    step3,调用Cookie的setValue (String newValue)方法修改该Cookie的值。
    step4,将修改后的Cookie加入到response发送回客户端。

    Cookie[ ]Cookies = request.getCookies( ) ;
    if(Cookies != null ){
    	for(Cookie c : Cookies){
    		String name = c.getName() ;
    		if(name.equals("city"){
    			c.setValue( "ShangHai);
    			response.addCookie( c ) ;//同名Cookie会覆盖.以达到修改的目的
    		}
    	)
    )
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.2.6 Cookie的生存时间(生命周期)

    • 默认情况下,浏览器会将Cookie保存在内存中,只要浏览器不关闭,Cookie就一直存在。
    • 如果希望关闭浏览器后Cookie仍在,可以通过设置过期时间。
    void Cookie.setMaxAge ( int seconds ) ;//注: seconds单位是秒,精度不是很高
    
    
    • 1
    • 2
    • seconds > 0:浏览器要保存Cookie的最长时间为设置的参数值,如果超过指定的时间,浏览器会删除这个Cookie。此时Cookie保存在硬盘上
    • seconds = 0:删除Cookie。在修改Cookie的生存时间为0后,随着response发送回客户端,替换原有Cookie,因生命周期到了即将该Cookie删除。
    • seconds< 0:缺省值,浏览器会将Cookie保存到内存中

    1.2.7 Cookie的编码与解码

    1.2.7.1 Cookie的编码

    Cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。

    Cookie c = new Cookie("welcome",URLEncoder.encode("欢迎来到中山","utf-8"));
    
    • 1

    1.2.7.2 Cookie的解码

    编码后的Cookie为了看到实际的中文,需要还原后再显示.

    for(Cookie c:cookies){
    			System.out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
    			out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 注意:
      解码要与编码格式保持一致
    package com.qst.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CookieServlet2 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		Cookie[] cookies = request.getCookies();
    		PrintWriter out =response.getWriter();
    		for(Cookie c:cookies){
    			System.out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
    			out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
    		}
    	}
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    1.3 cookie的特点和作用

    cookie的特点和作用
    特点:

    1. cookie存储数据在客户端浏览器
    2. 浏览器对于单个cookie 的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)

    作用:
    1. cookie—般用于存出少量的不太敏感的数据
    2. 在不登录的情况下,完成服务器对客户端的身份识别

  • 相关阅读:
    Doris代码结构
    Vue3最佳实践 第八章 ESLint 与 测试 ( ESLint )
    Otter改造 增加springboot模块和HTTP调用功能
    Java中获取异常栈中的底层异常信息-分析Java异常栈
    【Java学习】JDK安装及第一个java程序
    有序单链表的插入删除操作
    猿如意---Python3.10版本手把手教学安装和下载.
    95后大厂程序员删库被判刑,只因项目被接手对领导心生不满
    Day4: 5道C++ 面向对象高频题整理
    第二章《Java程序世界初探》第6节:赋值运算符
  • 原文地址:https://blog.csdn.net/qq_45821255/article/details/125438953