HttpSession对象
对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。
Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享
数据。我们可以通过 request.getSession()方法,来获取当前会话的 session 对象。
Session对象
1. Session对象的获取
request.getSession();
如果session对象存在,则直接获取;如果session对象不存在,则新建session
2. JSESSIONID标识符
当请求到达服务器时,如果使用了session,服务器会去获取一个JSESSIONID的cookie对象
如果cookie对象不存在,则新建session对象,并设置sessionId,将sessionId回传给客户端中,设置对应的cookie
如果cookie对象存在,服务器会比较客户端传递的sessionID是否与服务端的一致
如果不一致,新建session对象,并设置sessionId,将sessionId回传给客户端中,重新设置对应的cookie
如果一致,则获取到当前session对象
Session底层是依赖cookie的,默认关闭浏览器失效。
3. session作用域
在一次会话有效,可以有多次请求和响应,在会话中数据共享。
setAttribute()
getAttribute()
removeAttribute()
request作用域
一次请求中有效,在请求转发中有效,在重定向失效
session作用域
一次会话中有效,无论请求转发还是重定向都有效,会话销毁则失效
4. session的销毁
1. 关闭服务器
2. 关闭浏览器
session底层依赖cookie,cookie默认只在浏览器中存活,浏览器关闭则失效
3. 默认最大不活动时间
当指定时间内没有任何操作,则session对象失效;在时间未到达之前有操作,则会重新计时
服务器中设定了session的最大不活动时间,Tomcat服务器设置的是30分钟
在Tomcat的解压目录的conf中web.xml配置文件中
<!-- session 默认的最大不活动时间。单位:分钟。 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4. 手动设置失效时间
通过session.setMaxInactiveInterval(int) 来设定 session 的最大不活动时间,单位为秒。
通过getMaxInactiveInterval()方法获取当前最大不活动时间
5. 手动销毁
session.invalidate();
@WebServlet("/se01")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session对象
HttpSession session = req.getSession();
/**
* 常用方法
*/
System.out.println("SessionId:" + session.getId());
System.out.println("会话创建时间:" + session.getCreationTime());
System.out.println("最后一次访问时间:" + session.getLastAccessedTime());
System.out.println("是否是新的对象:" + session.isNew());
/**
* 设置作用域
*/
// 设置request作用域
req.setAttribute("name","request");
// 设置session作用域
session.setAttribute("name2","session");
/**
* 获取作用域
*/
// request作用域
System.out.println(req.getAttribute("name"));
// session作用域
System.out.println(session.getAttribute("name2"));
/**
* session的销毁
*/
// 获取最大不活动时间
int sec = session.getMaxInactiveInterval();
System.out.println("最大不活动时间:" + sec);
// 设置最大不活动时间
session.setMaxInactiveInterval(20); // 20秒失效
// 手动销毁
session.invalidate();
// 请求转发 (一次请求)
// req.getRequestDispatcher("se02").forward(req,resp);
// 重定向(两次请求)
resp.sendRedirect("se02");
}
}