浅谈一下Session
Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。
客户端与服务器进行通信依靠HTTP协议,而HTTP协议是一种无状态的协议,服务器无需关心客户端是谁,每次都需要检查客户端的身份,这时就需要借助cookie来进行验证客户端的身份。
服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪 。
Session和Cookie的主要区别在于:
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的Session中
会话追踪
session底层是依赖Cookie的,当首次使用session时,服务器端要创建session,session保存在服务器端缓存,而给客户端的是sessionid(一个cookie中保存了sessionid)客户端带走的是sessionid,而数据保存在session中。当客户端字词访问服务器是,在请求中会带上sessionid,而服务器会通过sessionid找到对应的session,而无需再创建新的session
服务器识别 Session 的关键就是依靠一个名为 JSESSIONID 的 Cookie 。在Servlet 中第一次调用 req.getSession() 时, Servlet 容器自动创建一个 Session ID ,然后通过一个名为 JSESSIONID的Cookie 发送给浏览器 :
获取HttpSession对象
HttpServletRequest接口提供了获取HttpSession对象的方法
在程序中第一次执行request.getSession()时,服务器才会创建Session。
HttpSession接口提供的方法
HttpSession接口提供了存取会话域属性和管理会话生命周期的方法:
实现代码:
@WebServlet("/session.do")
public class SesstionServlet extends HttpServlet {
// 获取会话
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
System.out.println("sessionId:" + session.getId());
System.out.println("session创建时间" + new Date(session.getCreationTime()));
System.out.println("session最后访问" + new Date(session.getLastAccessedTime()));
}
}
运行结果:
session测试
产生”幸运数字“存入sessionid
@WebServlet("/three.do")
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 本次请求的request,获取当前对话HttpSession
HttpSession session = req.getSession();
System.out.println("本次会话:" + session.getId());
// 产生幸运数字,并存入当前会话
int luckNumber = (int) (Math.random() * 100);
System.out.println("幸运数字:" + luckNumber);
session.setAttribute(session.getId(), luckNumber);
}
}
获取幸运数字 根据sessionid(注意是同一个sessionid)
@WebServlet("/test.do")
public class TestSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
System.out.println("本次会话:" + session.getId());
// 获取会话中”保存的数字“
String result = String.valueOf(session.getAttribute(session.getId()));
// 响应输出
PrintWriter out = resp.getWriter();
out.write(result);
out.flush();
}
}
Session生命周期
Session失效时间:Session具有一定声生命周期,如果Session超过会话的最大不活动时间,会话自动失效,会话的最大不活动时间指会话超过此时间段不进行任何操作。
设置Session的失效时间。
方法1:在工程的web.xml中配置Session的生命周期,单位为分钟。
<Session-config><Session-timeout>15</Session-timeout></Session-config>
方法2:在程序硬编码设置。
Session.setMaxInactiveInterval(30 * 60); //设置单位为秒,设置为-1永不过期;
方法3:在Tomcat安装目录下conf/web.xml中配置(Web容器级别)。
<Session-config><Session-timeout>15</Session-timeout></Session-config>
手动销毁Session:可以通过调用invalidate()方法立即清除会话对象及其所有会话域属。