什么是Session?
Session在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。
Session在专业术语中,是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
在Java Web开发中,Session是一种用于跟踪用户会话的对象。通过使用Session,可以存储和检索与特定用户会话相关的数据。以下是在Java Web中使用Session的一些常见用法:
- 存储数据:Session对象可以存储任何类型的对象,例如字符串、整数、集合等。在用户访问Web应用程序时,可以在Session中存储数据,以便在多个页面之间共享数据。例如,可以在用户登录时将用户信息存储在Session中,以便在用户访问其他页面时仍然可以访问这些信息。
- 检索数据:可以通过Session对象的get方法检索存储在其中的数据。例如,可以使用以下代码从Session中获取名为"username"的数据:
String username = (String) session.getAttribute("username");
- 设置超时时间:可以通过设置Session的超时时间来控制会话的持续时间。如果用户在指定的超时时间内没有活动,则Session将自动失效。例如,以下代码将设置Session的超时时间为30分钟:
session.setMaxInactiveInterval(30 * 60); // 30分钟
- 销毁Session:当不再需要Session时,可以使用Session的invalidate方法销毁它。这将删除Session中存储的所有数据,并使Session失效。例如:
session.invalidate();
需要注意的是,使用Session时应该遵循最佳实践,并注意保护用户的隐私和数据安全。例如,应该避免将敏感信息存储在Session中,并使用安全的会话管理方法来保护会话数据。
在JavaWeb开发中:
- Session是一个接口(HttpSession)
- Session就是会话;它是维护客户端与服务器之间关联的一种技术
- 每个客户端都有自己的一个Session
- Session会话经常用来保存用户登录后的信息
案例实操
session的创建的与获取
如何创建和获取 Session。它们的 API 是一样的。
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。
isNew()
判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId()
得到 Session 的会话 id 值。
/**
* @author: lisong
* @createTime: 2023-08-02 16:00 星期三
* @description:
*/
public class SessionServlet extends HttpServlet {
//session的创建和获取
protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取客户端Session会话,没有服务器则自动创建
var session = req.getSession();
//2. 判断当前Session是否第一次创建
boolean isNewSession = session.isNew();
//3. 获取当前Session的唯一标识
var id = session.getId();
resp.getWriter().write("Session["
+ "当前session是否第一次创建:" + isNewSession + "<br/>" + "当前session唯一标识:" + id + "]");
}
}
Session 域中数据的存取
//向session域中存取数据
protected void setSessionScope(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//向session域中保存数据
req.getSession().setAttribute("key1","value1");
//获取session域中数据
var sessionVal = req.getSession().getAttribute("key1");
System.out.println("获取session域中数据:" + sessionVal);
resp.getWriter().write("key1的session的value值:" + sessionVal);
}
Session 生命周期控制
-
public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。
- 值为正数的时候,设定 Session 的超时时长。
- 负数表示永不超时(极少使用)
public int getMaxInactiveInterval():获取 Session 的超时时间
public void invalidate(): 让当前 Session 会话马上超时无效。
Session 默认的超时时间长为 30 分钟。 因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
修改默认的 Session 的超时时长为其他时长,可以在 web.xml 配置文件中做以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。
<!-- 修改当前web工程创建出来的所有session默认为10分钟超时时长 -->
<session-config>
<session-timeout>10</session-timeout>
</session-config>
如果只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设置。 session.setMaxInactiveInterval(int interval)单独设置超时时长。
//设置当前session超时时长
public void updateSession(HttpServletRequest request,HttpServletResponse response) throws IOException {
//获取Session对象
HttpSession session = request.getSession();
//设置当前Session 5秒后超时
session.setMaxInactiveInterval(5);
//响应给客户端输出
response.getWriter().write("当前Session5秒后超时");
}
//设置当前session马上超时
public void updateSession(HttpServletRequest request,HttpServletResponse response) throws IOException {
//获取Session对象
HttpSession session = request.getSession();
//设置当前Session马上超时
session.invalidate();
response.getWriter().write("当前Session设置为超时(无效)");
}
Session的超时概念
session的超时指客户端两次请求的最大间隔时长。
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 已经设置为超时(无效)");
}
浏览器与Session之间的底层原理
Session底层基于Cookie实现的。
当用户在浏览器中访问一个Web应用程序时,浏览器会向服务器发送HTTP请求。客户端(浏览器)首次发送请求时,没有创建Cookie,服务器收到请求后会为该用户创建一个Session对象,并为其分配一个唯一的Session ID。通过响应把新创建出来的Session ID返回给客户端,客户端解析收到的数据,马上创建了一个Cookie对象,这个Session ID会被存储在Cookie中。当第二次及以后每次发送请求,都会把Session ID以Cookie的形式发送给服务器,服务器就可以通过Cookie中Session ID值找到自己创建的Session对象并返回。
假如Cookie被删除就相当于Session对象也被删除,此时当你在获取Session对象时就需要向上面一样,重复首次发送没有Cookie的请求过程。
Cookie形式:Cookie: JSESSIONID=F78BC66D93215A011033CC65CB85E92A
(这个值就是Session的ID)
浏览器、Session和Cookie之间的执行过程
用户通过浏览器访问web网站进行用户登录,描述浏览器、Session和Cookie之间的执行过程:
- 浏览器向服务器发送HTTP请求,获取登录页面。
- 服务器响应请求,返回登录页的HTML。
- 用户在登录页输入用户名和密码,点击登录。
- 服务器接收到登录请求后,会创建一个Session对象,并在其中存储用户相关的数据,例如用户ID等。
- 服务器为该Session生成一个唯一的标识符(Session ID),并在响应中以Cookie的形式将Session ID发送给浏览器。
- 浏览器收到Cookie后,将其存储在本地。
- 当用户再次访问服务器时,浏览器会将包含Session ID的Cookie发送回服务器。
- 服务器接收到请求后,解析请求中的Cookie,提取出Session ID。
- 服务器根据Session ID找到对应的Session对象,从中取出相关数据,以实现用户的会话跟踪。
在整个过程中,Session和Cookie起到了重要的角色。通过Session,服务器可以跟踪用户的会话状态,而通过Cookie,服务器可以在浏览器端存储和读取数据,从而实现用户的身份验证和会话管理。