探秘Session跨页面传递数据的神奇力量
- 前言
- 一、什么是 Session 会话?
- 二、如何创建 Session 和获取(id 号,是否为新)
- 三、Session 域数据的存取
- 四、Session 生命周期控制
- 五、Session的销毁
- 五、浏览器和 Session 之间关联的技术内幕
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!
一、什么是 Session 会话?
- Session 就一个接口(HttpSession)。
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
- session对象是由服务器创建并且存储在服务器里的。
二、如何创建 Session 和获取(id 号,是否为新)
如何创建和获取 Session。它们的 API 是一样的。
-
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。 -
isNew()
判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建 - 每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId()
得到 Session 的会话 id 值。
三、Session 域数据的存取
/**
* 往 Session 中保存数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
req.getSession().setAttribute("key1", "value1");
resp.getWriter().write("已经往 Session 中保存了数据");
}
/**
* 获取 Session 域中的数据
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从 Session 中获取出 key1 的数据是:" + attribute);
}
四、Session 生命周期控制
session的生命周期,一般来说,session的生命周期也是受到两个因素的影响:
- 服务器对于session对象的保存的最大时间的设置。
- 客户端进程是否关闭。客户端进程关闭,只对客户端自身有影响,对其它封包工具是没有影响的。
服务器对session对象生命周期的设置如下:
-
public void setMaxInactiveInterval(int interval)
设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。值为正数的时候,设定 Session 的超时时长。 负数表示永不超时(极少使用) -
public int getMaxInactiveInterval()
获取 Session 的超时时间 -
public void invalidate()
让当前 Session 会话马上超时无效。 - Session 默认的超时时长是多少!
Session 默认的超时时间长为 30 分钟。
因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
<session-config> <session-timeout>30</session-timeout> </session-config>
- 如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做 以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。
<!--表示当前 web 工程。创建出来 的所有 Session 默认是 20 分钟 超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
- 如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。
setMaxInactiveInterval(int interval)
来进行单独的设 置。session.setMaxInactiveInterval(int interval)
单独设置超时时长。
Session 超时的概念介绍:
Session的超时是指在一段时间内没有活动或用户不再与服务器进行交互时,会话数据将自动过期失效。在Web开发中,会话是用来跟踪用户在网站上的活动状态的一种机制。当用户登录到网站或应用程序时,服务器会为其创建一个会话,并分配一个唯一的会话ID。该会话ID通常存储在一个名为"session cookie"的小文件中,发送给用户的浏览器。
每当用户与服务器进行交互(例如访问页面,提交表单,或者与应用程序进行交互),服务器都会根据会话ID来识别用户,并根据需要更新会话数据。会话数据可能包括用户登录信息、购物车内容、用户偏好设置等等。
然而,如果用户在一段时间内没有任何活动,服务器会自动将该会话标记为过期。这样做的原因是为了安全和资源管理考虑。如果一个会话保持长时间处于活动状态,这可能会导致资源浪费和安全风险,因为其他人可能可以利用该会话进行非法操作。因此,通过设置会话超时时间,可以确保闲置会话在一段时间后自动关闭,从而降低风险并释放服务器资源。
会话超时时间可以根据具体的应用场景和安全需求进行配置。通常,银行或其他敏感信息应用可能会设置较短的会话超时时间,以增加安全性。而在一些社交媒体或新闻网站等应用中,可能会设置较长的会话超时时间,以提供更好的用户体验。
总的来说,会话超时是会话管理的重要方面,有助于平衡用户体验和安全性之间的关系。
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取Session对象
HttpSession session = req.getSession();
// 设置当前Session3秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write("当前Session已经设置为3秒后超时");
}
Session 马上被超时示例:
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取Session对象
HttpSession session = req.getSession();
// 让Session会话马上超时
session.invalidate();
resp.getWriter().write("Session已经设置为超时(无效)");
}
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取了Session的默认超时时长
int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
resp.getWriter().write("Session的默认超时时长为:" + maxInactiveInterval + " 秒 ");
}
五、Session的销毁
在计算机科学和网络编程中,"session"一词可以指代多个概念,因此有几种情况可能导致会话(session)销毁。以下是一些常见的情况:
-
用户主动注销:当用户选择退出当前会话时,会话会被销毁。这可以在网站或应用程序中通过点击"注销"或"退出"按钮来实现。
-
用户关闭浏览器会话:当关闭当前浏览器窗口时,会话(session)通常会被销毁,但这取决于具体的实现方式和配置。
在大多数情况下,当用户关闭浏览器窗口时,浏览器会自动删除与该会话相关的会话标识符(session ID)和会话数据。这导致服务器上的会话失效并被销毁。当用户再次打开浏览器并访问相同的网站时,将会创建一个新的会话。
然而,需要注意的是,浏览器的行为可以受到不同因素的影响。例如,浏览器可能提供"恢复会话"的功能,使用户能够重新打开上次关闭的窗口并继续之前的会话。在这种情况下,会话可能不会立即销毁。
此外,开发人员也可以通过在会话中设置持久性的 cookie 或其他技术来实现会话的跨会话保留。这样,即使关闭浏览器窗口,会话数据仍然可以在下次打开浏览器时恢复。但这不是会话的标准行为,而是开发人员根据需求进行的特定实现。
因此,总的来说,关闭当前浏览器窗口通常会导致会话被销毁,但具体行为可能会受到浏览器配置、会话管理策略以及开发人员实现的影响。 -
会话超时:为了提高安全性,许多系统会设置会话超时时间。如果在一段时间内没有用户活动,会话可能会被销毁。超时时间可以是固定的(例如,30分钟)或根据用户活动动态调整。
-
服务器重启或崩溃:如果服务器在会话期间发生重启或崩溃,所有当前活动的会话通常都会被销毁。在服务器重新启动后,用户需要重新建立新的会话。
-
并发限制:某些系统可能对同时活动的会话数进行限制。如果达到了最大并发会话数,新的会话请求可能会导致旧的会话被销毁,以便为新会话腾出空间。
-
安全性事件:如果系统检测到会话被破坏、会话劫持或其他安全性事件,它可能会立即销毁相关的会话。
五、浏览器和 Session 之间关联的技术内幕
浏览器和Session之间的关联涉及到几个关键技术内幕。在Web开发中,会话(Session)是一种在服务器和浏览器之间跟踪用户状态的机制。以下是浏览器和Session之间关联的技术内幕:
-
Cookie:Cookie是存储在用户浏览器中的小型文本文件,由服务器通过HTTP响应头发送给浏览器,并在后续的请求中通过HTTP请求头传回给服务器。Cookie通常包含会话ID等信息,用于标识用户的会话状态。服务器可以使用这个会话ID来识别用户,并维护用户的会话数据。
-
Session ID:当用户首次访问一个使用Session的网站时,服务器会为用户生成一个唯一的Session ID。这个Session ID通常被存储在一个名为"session cookie"的Cookie中,它会随着每个请求发送回服务器,以便服务器能够识别和管理用户的会话状态。
-
会话管理:服务器使用会话管理技术来跟踪和管理用户的会话状态。一旦用户通过Cookie提供了Session ID,服务器就可以将该Session ID与会话数据相关联,并在后续的请求中使用该ID来识别用户。
-
会话数据:服务器可以将用户特定的数据存储在会话中,如登录状态、购物车内容、用户偏好设置等。这些会话数据在用户与服务器之间的多个请求之间持久存在,从而提供了连续和一致的用户体验。
-
会话超时:为了安全和资源管理,会话通常有一个超时机制。服务器可以设置会话的最大时长,在用户一段时间内没有活动时,会话将被标记为过期并自动失效。
总体来说,浏览器和Session之间的关联是通过Cookie技术实现的。Cookie中存储的Session ID允许服务器识别用户,并跟踪和管理用户的会话状态。这样,服务器可以为每个用户提供个性化和连续的服务,而不需要每次都重新验证身份或重复操作。文章来源:https://uudwc.com/A/0r1kw
文章来源地址https://uudwc.com/A/0r1kw