HttpSession概述
-
HttpSession:服务器端会话管理技术
- 本质也是采用客户端会话管理技术
- 只不过在客户端保存的是一个特殊标识,而共享的数据保存到了服务器端的内存对象中
- 每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享
- 是 Servlet 规范中四大域对象之一的会话域对象
- 作用:可以实现数据共享
-
域对象API
域对象 功能 作用 ServletContext 应用域 在整个应用之间实现数据共享 ServletRequest 请求域 在当前的请求或请求转发之间实现数据共享 HttpSession 会话域 在当前会话范围之间实现数据共享 -
补充:
-
HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个Cookie
-
是一个由服务器自动创建的特殊的Cookie,Cookie的名称就是JSESSIONID,Cookie的值是服务器分配的一个唯一的标识
-
当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了
-
HttpSession的常用方法
返回值 | 方法名 | 说明 |
---|---|---|
void | setAttribute(String name,Object) | 设置共享数据 |
Object | getAttribute(String name) | 获取共享数据 |
void | removeAttribute(String name) | 移除共享数据 |
String | getId() | 获取唯一标识名称 |
void | Invalidate() | 让session立即失效 |
HttpSession的获取
- 获取HttpSession是通过HttpServletRequest接口中的两个方法获取的:
返回值 | 方法名 | 说明 |
---|---|---|
HttpSession | getSession() | 获取HttpSession对象 |
HttpSession | getSession(boolean create) | 获取HttpSession对象,未获取到是否自动创建 |
HttpSession的使用
- 案例演示:
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的用户名
String username = req.getParameter("username");
//2.获取HttpSession的对象
HttpSession session = req.getSession();
//3.将用户名信息添加到共享数据中
session.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取HttpSession对象
HttpSession session = req.getSession();
System.out.println(session);
System.out.println(session.getId());
//2.获取共享数据
Object username = session.getAttribute("username");
//3.将数据响应给浏览器
resp.getWriter().write(username+"");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
-
验证:demo1和demo2的session是否是同一个对象
-
访问:分别访问两个demo,发现一致(也可以通过Network查看)
HttpSession的钝化和活化
-
什么是钝化和活化
- 钝化:序列化。把长时间不用,但还不到过期时间的 HttpSession 进行序列化,写到磁盘上
- 活化:相反的状态
-
何时钝化
-
第一种情况:当访问量很大时,服务器会根据 getLastAccessTime 来进行排序,对长时间不用,但是还没到过期时间的 HttpSession 进行序列化。
-
第二种情况:当服务器进行重启的时候,为了保持客户 HttpSession 中的数据,也要对其进行序列化
-
-
注意
- HttpSession 的序列化由服务器自动完成,我们无需关心