1、HttpSession对象介绍
它是Servlet规范中提供的一个接口。该接口的实现由Servlet规范的实现提供商提供。我们使用的是Tomcat服务器,它对Servlet规范进行了实现,所以HttpSession接口的实现由Tomcat提供。该对象用于提供一种通过多个页面请求或访问网站来标识用户并存储有关该用户的信息的方法。简单说它就是一个服务端会话对象,用于存储用户的会话数据。
同时,它也是Servlet规范中四大域对象之一的会话域对象。并且它也是用于实现数据共享的。但它与我们之前讲解的应用域和请求域是有区别的。
?
?
?2、代码示例:
/*
Session的基本使用
*/
@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();
System.out.println(session);
System.out.println(session.getId());
//3.将用户名信息添加到共享数据中
session.setAttribute("username",username);
//实现url重写 相当于在地址栏后面拼接了一个jsessionid
resp.getWriter().write("<a href='"+resp.encodeURL("http://localhost:8080/session/servletDemo03")+"'>go servletDemo03</a>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
/*
Session的基本使用
*/
@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);
}
}
3、HttpSession的细节
浏览器禁用Cookie:
? ? ? ? 方式一:通过提示信息告知用户,大部分采用的解决方式。(推荐)
? ? ? ? 方式二:访问时拼接jsessionid标识,通过encodeURL()方法重写地址。(了解)
钝化与活化:
? ? ? ? 钝化:序列化。把长时间不用,但还没到期的HttpSession进行序列化,写到磁盘上。
? ? ? ? 活化:相反的状态。
何时钝化:
? ? ? ? (1)、当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没有到期的HttpSession进行序列化。
? ? ? ? (2)、当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对其进行序列化。
注意:
? ? ? ? HttpSession的序列化由服务器自动完成,我们无需关心。
|