【JavaWeb】会话跟踪技术Cookie与Session原始真解(上)

简介: 文章目录1 什么是会话?2 Cookie技术2.1 Cookie简介2.2 Cookie的理解与创建2.3 服务器获取Cookie与Cookie的修改2.4 Cookie的生命控制与生命周期2.5 Cookie有效路径Path设置3 Session会话技术3.1 初探Session3.2 Session的创建、获取与基本使用3.3 Session的生命控制与生命周期3.4 如何理解Session底层是基于Cookie实现的?

1 什么是会话?

在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求响应的过程,例如一个用户在某网站上的整个购物过程就是一个会话。



在打电话过程中,通话双方有通话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据。例如,用户甲和乙的信息分别登录了购物网站,甲购买了一个iphone手机,乙购买了一个ipad,当这两个用户结账时,Web服务器需要对用户甲和乙的信息分别进行保存。其中HttpServletRequest对象和ServletContext对象都可以对数据进行保存,但是这两个对象都不行,具体原因如下:


客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求的数据会丢失。


使用ServletContext对象保存数据时,由于同一个Web应用共享的时是一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品时哪个用户购买的,而会将购物网站中所有用户购买的商品进行结算,这显然也是不可行的。


为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别为Cookie和Session。


具体来说,Cookie和Session技术的存在是为了保存会话过程中产生的数据。


2 Cookie技术

2.1 Cookie简介

Cookie翻译过来是饼干的意思。Cookie 是 Servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。 Cookie 可以唯一的标识客户端,因此 Cookie 常用于会话管理。


说明:


  1. Cookie是服务器通知客户端保存键值对的一种技术
  2. 客户端有了 Cookie 后,每次请求都发送给服务器
  3. 每个 Cookie 的大小不超过 4kb

2.2 Cookie的理解与创建

在生活中,我们经常遇到这样的情况:登录一个网站后,下一次再登录,不需要重复输入账户密码,这就是使用到了cookie存储了一些需要的数据。


Cookie是客户端技术,服务器会将每个用户的数据以cookie的形式发送给用户各自的浏览器,当用户使用浏览器访问各自的资源时,就带着各自的数据去操作。 Cookie唯一标识了客户端。示意图如下:


Cookie创建的实现原理如下:

Cookie实现基于http协议,响应头:set-cookie,请求头:cookie


浏览器会一次性地将当前域名下的所有的Cookie都携带到对应的资源里去,我们需要时就直接获取对应键的名称就可以得到。


在Cookie的创建中,首先客户端是没有Cookie的,由Tomcat服务器创建了Cookie对象,存储了相应的键值对,并通过响应头通知客户端保存相应的cookie。客户端收到响应后,则会去创建相应的Cookie,如果已经存在,则会去修改。 示意图如下:


Cookie创建示例代码:

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
public class HelloCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("name", "Peter");
        resp.addCookie(cookie);
    }
}



示例中,我们只创建了一个Cookie,实际可以创建多个,这里不再赘述。


2.3 服务器获取Cookie与Cookie的修改

服务器获取客户端的Cookie,只需要短短一行代码:


req.getCookies();
1

该方法会返回一个Cookie[]。


下面演示将Cookie创建案例中的cookie获取到服务端,并打印:

HelloCookie添加如下代码:



CookieServlet.java

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
public class CookieServlet extends HttpServlet {
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            //getName方法返回cookie的key
            //getValue方法返回对应的value
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
        }
    }
}

如果想要获取特定name的值,只需要在遍历过程中进行过滤判断。一般进行过滤筛选的方法,为了方便起见,常常写成工具类:

import javax.servlet.http.Cookie;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 工具类
 */
public class CookieUtils {
    /**
     * 寻找特定的cookie
     * @param name 查找的key
     * @param cookies 获取的cookies数组
     * @return 返回特定的cookie或者null
     */
    public static Cookie findCookie(String name, Cookie[] cookies){
        if (name == null || cookies == null || cookies.length == 0){
            return null;
        }
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie;
            }
        }
        return null;
    }
}

Cookie的修改


方案一:


创建一个同名的Cookie对象;

在构造器中赋予新Cookie值;

调用response.addCookie(newCookie);

方案二:


先找到需要修改的Cookie对象;

调用setValue()方法赋予新的Cookie值;

调用response.addCookie(cookie);

2.4 Cookie的生命控制与生命周期

Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除)。


默认情况下:

Cookie存储在浏览器内存中,当关闭浏览器内存释放,它自动销毁,所谓的无痕浏览就是这样。


非默认情况,人为设定:

通过setMaxAge(int expiry)指定cookie的最大生存时间(以秒为单位)。

正值表示cookie将在经过该值数秒后过期,负值则意味着不能持久存储,将在web浏览器退出时删除。

Cookie cookie = new Cookie("name", "Peter");
cookie.setMaxAge(60*60*24*3); //设置存活时间三天
resp.addCookie(cookie);


相关文章
|
27天前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
104 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
10天前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
12 1
|
2月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
2月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
49 0
|
5月前
|
存储 编解码 应用服务中间件
会话跟踪技术(Session 以及Cookie)
会话跟踪技术(Session 以及Cookie)
|
2月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
2月前
|
存储 JSON 数据安全/隐私保护
Cookie + Session 的时代已经过去了?
在探讨“Cookie + Session”这一经典组合是否已经过时的议题时,我们首先需要理解它们在Web应用认证和会话管理中的历史地位与当前面临的挑战。随着Web技术的飞速发展,特别是无状态服务、OAuth、JWT(JSON Web Tokens)等技术的兴起,这一传统机制确实面临了前所未有的变革压力。但说它“完全过去”或许过于绝对,因为它在特定场景下仍发挥着重要作用。
33 0
|
3月前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
143 1
|
3月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
50 1
|
3月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
54 2