深入理解Web开发中的Session与Cookie:初学者指南与巩固知识

前言

深入理解Web开发中的Session与Cookie:初学者指南与巩固知识

在 Web 应用程序(可理解为一个网站)里,Session 是一个非常重要的概念,主要用于实现用户身份认证等功能。Cookie 也是一个非常重要的概念,主要用于数据传递等功能。今天就来讲讲这两个东西。

当时刚开始接触这两个概念时,我对这两个东西的认知非常模糊。并且,这也与我自身 Java 基础不牢固有关,从而在学习 Java Web 的过程中埋下了许多隐患。如今,重新进行梳理,希望能给屏幕前的你带来益处。

这篇文章的目标人群包括学了之后就忘记的人,以及学了之后想要进行巩固的人。同时,如果还没有开始学习,那就更好了,直接阅读这一篇就足够了。

Session 的概念

同时也能维护用户的会话状态。

那问题来了,什么是「会话」?

会话指的是用户与服务器之间存在的一种交互情况。在这种交互中,包含了一系列的请求以及相应的响应。

用户访问 Web 应用时,服务器会创建一个独一无二的会话 ID。这个会话 ID 会被存储在用户浏览器的 Cookie 里。在后续的请求中,浏览器会把会话 ID 当作参数发送给服务器,这样服务器就能识别用户,并且可以将其请求与之前的请求关联起来。

为什么会有 Session?

HTTP 协议是无状态的。当用户在网站中进行多次请求时,服务器无法判断这些请求是否来自同一用户。于是出现了一种技术,这种技术被称为「会话跟踪技术」。

会话跟踪技术可以解决这个问题。无状态通信与之不同,会话是有状态的通信,这种通信需要至少一方来维持当前的状态信息以及历史信息。

Session 是一种会话跟踪技术,同时后面提到的 Cookie 也是会话跟踪技术。

Session 的原理

Session 的原理是以服务器端的存储和管理为基础,所以相对而言是比较安全的。用户访问 Web 应用程序时,服务器会给每个用户创建一个独一无二的 Session ID。服务器会把 Session ID 以及与之对应的会话状态,存储在内存或者数据库里。同时,服务器也会把一份 Session ID 返回给浏览器,让浏览器把它存储在 Cookie 中,并且在一定时间内保持有效。用户进行后续请求时,服务器凭借 Session ID 来辨认用户,还能获取并维护用户的会话状态。最后,若用户关闭浏览器或者在一定时间内没有活动,服务器就会自动将对应的 Session 销毁。

Session 的优点在于其安全性相对较高,它的存储容量能够存储任意数据类型,同时还可以设置失效时间。然而,它也存在着一些缺点:

代码如何写?

那服务器这边是怎样去存储和管理的呢?代码是怎样写的呢?

在 Java Web 领域,能够运用 Servlet API 里封装好的 Session 对象,也就是 HttpSession 来开展相关操作。

在 Servlet API 里,HttpSession 是由 Servlet 容器创建的,像 Tomcat 这样的 Servlet 容器可以创建 HttpSession。它具备存储任意 Java 对象的能力。我们能够利用 setAttribute()这个方法,把对象绑定到 Session 当中。之后,通过 getAttribute()这个方法,就可以获取到绑定在 Session 里的对象。

可以在一次会话的多次请求之间共享数据,并且能将数据保存在服务器端的对象里。

我们能够利用 HttpServletRequest 的 getSession() 方法去获取 HttpSession 对象。倘若 HttpSession 对象不存在的话,就会创建出一个新的 Session 对象。

Session 常用方法

以下是一些常用的 Session 对象的方法:

示例代码:

SessionServlet:

@WebServlet ,其名称为 "SessionServlet" ,并且其 urlPatterns 为 "/session" 。
这个类名为 SessionServlet,它是 HttpServlet 的子类。
    @Override
在 doGet 方法中,接收 HttpServletRequest 类型的 req 和 HttpServletResponse 类型的 resp 作为参数。在该方法内部,可能会抛出 ServletException 和 IOException 异常。
        // 获取 Session 对象
获取到请求对象 req ,然后通过 req 获取到 HttpSession ,将其赋值给 session 。
        // 将用户名存储到 Session 中
设置 session 的 "username" 属性,其值为请求中的 "username" 参数值。
        // 重定向到另一个页面
使用 resp 进行重定向到 "anotherPage.jsp" 的操作。
    }
    @Override
在 `doPost` 方法中,接收 `HttpServletRequest` 类型的 `req` 和 `HttpServletResponse` 类型的 `resp` 作为参数。在该方法内部,可能会抛出 `ServletException` 和 `IOException` 异常。
        super.doPost(req, resp);
    }
}
复制代码

这里使用 @WebServlet 对这个 Servlet 进行了配置,其处理的请求映射路径是 /session。主要进行的操作是关于 Session 对象的,包括存储用户信息,然后重定向到另一个页面。通过 Session,在另一个页面就能够获取到之前存储的信息。

anotherPage.jsp

<%@ page contenttype='text/html;charset=UTF-8' language='java'>
<%@ page session='true'>


    这里是有Session的


    <% string username='(String)' session.getattributeusername>
    

从Session中获取的信息:<%=username%>

复制代码

生成唯一 ID 返回给浏览器

@WebServlet 这个注解的名称是 "SessionIdServlet",它的 urlPatterns 属性值是 "/sessionId"。
公共类 SessionIdServlet 继承自 HttpServlet 类。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        // 获取 SessionID
获取到的 session 的标识为 sessionId,这个 sessionId 就是 session 所对应的唯一标识,即 session.getId() 的结果。
        // 创建名为JSESSIONID的 Cookie
创建了一个名为 cookie 的 Cookie 对象,其名称为 "JSESSIONID",值为 sessionId 。
        // 设置 Cookie 效时间为30分钟
        cookie.setMaxAge(30 * 60);
        // 将 Cookie 追加到响应中返回给浏览器
        resp.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
复制代码

通过浏览器向路径 /sessionId 发起请求,就能够接收到服务器返回的响应。在这个响应当中,有我们需要进行处理的名为 JSESSIONID 的 Cookie。

Cookie 的概念

Cookie 会被拿来与 Session 比较。Cookie 是用来跟踪浏览器用户身份的会话技术或机制,Session 也是。它们都能实现在多个页面间共享用户的状态。

Cookie 的原理

Cookie 是一种在客户端(浏览器)保存数据的机制。

浏览器首次向服务器发送请求时,服务器会创建 Cookie(如上述代码所写)。这个 Cookie 中包含着信息,比如用户的信息(包括用户偏好设置、广告偏好等)。随后,服务器将该 Cookie 发送到浏览器。

浏览器再次访问服务器时会携带服务器创建的 Cookie,这一过程无需我们进行操作,也无需编写任何代码,而是由浏览器帮我们在每一次请求中都带上了 Cookie。服务器端能够凭借 Cookie 中携带的数据来区分不同的用户。

Cookie 的优点在于能够长时间留存,同时能够在客户端进行设置。然而,它也具备一些不足之处:

总结

Session 是一种存储机制且位于服务器端。它的作用是把用户的状态信息存储在服务器上。并且每个用户都拥有一个独立的 Session。

用户第一次访问服务器时,服务器会创建一个 Session。接着,服务器会把 Session ID 放到一个名为 JSESSIONID 的 Cookie 里。然后,服务器将这个含有 Session ID 的 Cookie 发送给浏览器。

Cookie 是一种客户端(浏览器)的存储机制。它能将用户的状态信息存储在客户端浏览器上。我们清楚,当用户首次访问服务器时,服务器会把一些数据(例如 JSESSIONID)写入 Cookie 中,然后发送给客户端。而客户端在后续的请求里,会把 Cookie 发送给服务器。

Cookie 的存储容量比较小,通常只能存储 ASCII 码。而 Session 则可以存储任意数据类型。在安全性方面,Session 比 Cookie 更安全,原因是 Session 是存储在服务器上的,客户端无法直接对其进行访问。Cookie 能够进行跨域共享。Session 则只能在同一域名范围内进行共享。

最后的最后

本人水平有限,难免会出现错误和不足之处。如果屏幕前的各位发现了问题,恳请大家指出。

最后,感谢你看到了这里。感谢你对我的努力持认真态度。希望这篇博客能对你起到帮助作用。

这颗星是明亮而耀眼的。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读