当前位置: 首页 > article >正文

JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)

目录

一、HTTP无状态。

(1)"记住我"?

(2)HTTP无状态。

(3)信息存储客户端中。如何处理?

1、loaclStorage与sessionStorage。

2、Cookie。

二、Cookie。

(1)Cookie是什么?

(2)Cookie的特征。

1、Cookie组成。

2、Cookie的主要特性。

(3)Cookie的API。

1、创建Cookie。

2、发送Cookie。

3、获取Cookie值。

(4)Cookie的覆盖。

1、案例演示。

2、Cookie路径(path)。

3、Cookie覆盖。

(5)Cookie的生命周期。

1、什么是Cookie的生命?

2、Cookie死亡。

3、Cookie最大存活时间。


一、HTTP无状态。

(1)"记住我"?
  • 通常,处于登录界面时,我们输入用户名与密码点击"提交"前,会有一个“记住我”功能!当用户名、密码验证成功,浏览器该如何存储对应的信息(用户名、密码等等)呢?

  • 是保存在服务器?还是保存在客户端中?

(2)HTTP无状态。
  • HTTP协议是无状态的,这意味着服务器不会保存任何关于客户端请求之间的信息
  • 每次HTTP请求都是独立的,服务器不会记住之前发生过的请求。
  • 也就是:每个请求都是独立的,服务器处理完请求后就会结束会话,不会保留任何会话信息
  • 为了解决无状态协议带来的问题,引入了CookiesSession等技术来维持用户会话。Cookies是客户端的存储机制,用于保存状态信息;而Session则是服务器端的存储机制,用于跟踪用户状态。

  • 如果将“用户信息”存在在服务器中。那么就需要"东西"让服务器分辨当前是哪个用户访问,再给对应的用户信息。
  • 这样服务器的压力就会很大!所以应该是每个用户的"登录个人信息"存储在用户所安装的客户端浏览器中,而不是存储在服务器
  • 这样当用户A登录时,从用户A的客户端浏览器拿到对应的信息。当用户B登录时,就从用户B客户端浏览器拿到对应的信息。这样就有效的区分了每个客户端的信息。

(3)信息存储客户端中。如何处理?
  • 基于客户端浏览器的访问。如何将数据保存在客户端浏览器中?
  • 登录校验的逻辑代码是在服务器端运行的。只要登录成功后,就会将(用户名、密码)存储在到客户端浏览器中。

  • 如下三个被红色框选中的(客户端浏览器中)都可以存储信息。


1、loaclStorage与sessionStorage。
  • 其中本地存储空间(loaclStorage)、会话存储(sessionStorage)空间:都是纯正的js技术。
  • 它们之间的区别:loaclStorage是所有用户都可以拿到信息。(数据在浏览器关闭后仍可保留)而sessionStorage是在一次会话中有效。(与服务器一次通信)

2、Cookie。
  • 既可以使用js操作,也可以使用Java进行操作!因为服务器端代码(/..xxServlet)也是Java语言写的,这就刚好可以使用这个"Cookie"。
  • 接下来就详细的介绍Cookie!

二、Cookie。

(1)Cookie是什么?
  • "Cookie"翻译成中文:小甜点,小饼干的意思。
  • 在HTTP中它表示服务器发送给客户端浏览器的小甜点

  • 其实Cookie就是一个键和一个值(key/value)构成的,随着服务器端的响应发送给客户端浏览器。
  • 注意:Cookie的存储的key/value都是String类型域对象中存储的value是object类型

  • 如下:Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。
  • 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。
  • 当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!


(2)Cookie的特征。
1、Cookie组成。
  • Cookie通常包含一个(名称)、一个,以及一些属性。(如有效期、路径、域和安全标志)


  • 可以看到键"user"——>值"lisi"、键"password"——>值"123456"。
  • 响应的服务器是本机:http://localhost:8080。
  • 路径:"/"。表示所有的请求都可以拿到该Cookie。


2、Cookie的主要特性。
  • Cookie的工作原理涉及到客户端(浏览器)和服务器之间的交互。
  • Cookie创建于服务器,保存于客户端浏览器上不同浏览器之间Cookie无法共享,无法跨浏览器
  • 客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
  • Cookie本身是一种有用的技术,用于在客户端存储状态信息,但它也存在一些安全风险。在实际案例中,还需要对Cookie进行加密或者不存储敏感信息。(否则明文显示)

(3)Cookie的API。
  • Cookie是一个类(class)。

1、创建Cookie。
  • 通常都是使用:new 构造方法
  • 构造方法只有一个:new Cookie(键名,键值)。


  • 案例演示。创建服务器:AServlet。创建两个Cookie(cookie1、cookie2)。并使用addCookie()方法发送到客户端对应的Cookie如果不发送,客户端无法得到Cookie
package com.fs.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Title: AServlet
 * @Author HeYouLong
 * @Package com.fs.web
 * @Date 2024/11/27 下午4:52
 * @description: 测试类
 */
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Cookie
        Cookie cookie1 = new Cookie("k1","v1000");
        Cookie cookie2 = new Cookie("k2","v2000");

        //发送Cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

  • 此时cookie1的k1与v1000、cookie2的k2与v2000都已经存储在客户端中。


2、发送Cookie。
  • 服务器中调用方法:addCookie(Cookie对象)
  • 验证:之后的请求,客户端浏览器会自动的携带Cookie通过请求头发送给服务器。
  • 创建BServlet,里面只重写了doGet()方法。直接再次请求访问BServlet。
package com.fs.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Title: BServlet
 * @Author HeYouLong
 * @Package com.fs.web
 * @Date 2024/11/27 下午8:18
 * @description: 测试
 */
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}
  • 显然是自动的将Cookie发送给服务器了。



3、获取Cookie值。
  • 方法1。通过request.getHeader("Cookie")。不推荐!


  • 方法2。request.getCookies()。这样可以拿到所有的Cookie。再通过循环遍历,拿取对应的键名的键值。先通过getName()拿到键名,再根据键名拿到值getValue()


package com.fs.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Title: BServlet
 * @Author HeYouLong
 * @Package com.fs.web
 * @Date 2024/11/27 下午8:18
 * @description: 测试
 */
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取指定Cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if(name.equals("k1")){
                String value = cookie.getValue();
                System.out.println(name);
                System.out.println(value);
                break;
            }
        }
        /*String cookie = req.getHeader("Cookie");
        System.out.println(cookie);*/
    }
}

  • 成功拿到键名"k1"对应的键值"v1000"。


(4)Cookie的覆盖。
1、案例演示。
  • 先访问/AServlet。再访问/user/AServlet。看看对应的Cookie。
  • /AServlet。

  • /user/AServlet。


2、Cookie路径(path)。
  • 可以通过设置Cookie的path来指定浏览器,在访问什么样的路径时,包含什么样的Cookie
  • 如果Cookie的name(键名)与path(路径)一样,就会覆盖value(键值)
  • 如果没有设置path:默认值,创建Cookie的资源(服务器)的上级路径
  • 像访问资源(/user/BServlet)对应的path:"/user"。访问资源(/BServlet)对应的path:"/"。

  • 举例访问某个路径下的资源,能访问的对应Cookie。




  • 创建Cookie时,主动设置Cookie路径。方法:setPath()


3、Cookie覆盖。
  • 修改"/user/AServlet"。重新访问。


(5)Cookie的生命周期。
1、什么是Cookie的生命?
  • Cookie不只是有name(键名)和value(键值)。Cookie还有生命。

  • 所谓Cookie生命就是Cookie在客户端的有效时间。可以通过setMaxAge(int)来设置Cookie的最大有效时间。


2、Cookie死亡。
  • 像上面的BServlet,我把所有的客户端浏览器关闭(结束本次会话)。对应的Cookie(cookie1的k1与v1000、cookie2的k2与v2000)消失了。

  • 因为它们都是会话级别。会话结束,对应的Cookie自动失效。


  • k1、k2已消失。


3、Cookie最大存活时间。
  • 默认存活时间:会话级别。只有客户端的浏览器关闭,这个Cookie就会被删除!

  • 注意:如果是服务器关闭,只要客户端不关闭,Cookie不会被删除。


  • 调用setMaxAge(int 参数) 设置最大存活时间。参数的单位:秒。

  • 具体的实践大家自己尝试!


http://www.kler.cn/a/427704.html

相关文章:

  • 【触想智能】工业安卓一体机日常维护注意事项以及其应用领域分析
  • 基于Matlab的变压器仿真模型建模方法(8):三相变压器组的建模仿真
  • STORM写作系统用于多角度话题大纲的合成与检索
  • 了解 k8s 网络基础知识
  • 从excel数据导入到sqlsever遇到的问题
  • 第2章:CSS基本语法 --[CSS零基础入门]
  • 推荐在线Sql运行
  • Springboot 整合 Java DL4J 打造金融风险评估系统
  • IntelliJ+SpringBoot项目实战(25)--使用JavaMail发送邮件
  • Docker的彻底删除与重新安装(ubuntu22.04)
  • QT实战--带行号的支持高亮的编辑器实现(1)
  • Android12-Framework开机自启服务-应用-自动执行-循环检测
  • ORACLE表数据还原
  • 漫画之家:Spring Boot技术实现的漫画资源平台
  • 百度ueditor富文本插件多图片上传顺序混乱问题
  • JavaScript动态网络爬取:深入解析与实践指南
  • 分类算法中的样本不平衡问题及其解决方案
  • 鸿蒙实现数据管理
  • vue elementui layout布局组件实现规则的弹性布局
  • Qt Designer Ui设计