Session技术(服务器端的会话技术)
数据存储在服务器端 服务器会为每一个客户端创建一个Session对象,该客户端每次访问如果需要session对象,就返回之前创建的 服务器端的会话从第一次获得HttpSession对象开始的,直到HttpSession对象销毁结束
一.session概述
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中
二. Session的入门案例
① 得到HttpSession对象
request.getSession();
② 设置共享数据
session.setAttribute("sessionMsg","sessionValue");
③ 获得共享数据
Object sessionMsg = session.getAttribute("sessionMsg");
④ 移除共享数据 session.removeAttribute("sessionMsg");
public class SessionServlet extends BaseServlet {
protected void createSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session = " + session);
}
protected void addValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session = " + session);
session.setAttribute("sessionMsg","sessionValue");
}
protected void getValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session = " + session);
Object sessionMsg = session.getAttribute("sessionMsg");
System.out.println("sessionMsg = " + sessionMsg);
}
protected void removeValueSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session = " + session);
session.removeAttribute("sessionMsg");
}
}
移出的只是数据 不是对象 当你从新获取时 对象还是同一个对象,但是发现会取不到值
三.Session的工作机制
前提:浏览器正常访问服务器
-
服务器端没调用request.getSession()方法:什么都不会发生
-
服务器端调用了request.getSession()方法
-
服务器端检查当前请求中是否携带了JSESSIONID的Cookie
-
有:根据JSESSIONID在服务器端查找对应的HttpSession对象
-
能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
-
找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
-
-
无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
-
-
服务器是如何办到客户端和session对应关系? 是通过cookie办到的!session是依赖于cookie 当客户端第一次访问服务器,调用getSession(),新建一个session对象,并且设置一个cookie给浏览器(jsessionid) 当客户端第二次访问服务器,调用getSession(),就去获得请求中的jsessionid这个cookie,通过cookie的value值找到session对象
第一次
第一次 请求里面没有cookie,服务器会认为是一个新的客户端,第一次调用getSession(),就会新建一个session对象 就可以设置cokie
我们在响应里面就会有一个set-Coookie 这个cookie 一定要调用getSession()才会有
第二次
第二次就可以带着cookie 服务器就有cookie数据,跟着cookie数据就能得到session对象,所以session对象就不会新建 session对象不会新建,也就是不会在给响应
第二次的时候 响应里面就没有了 因为getsession不是新建的session对象,而是我们原来的session对象给获取过来
如何获取原来的session对象
是因为第二次的时候请求里面有一个cookie数据,把上次设置的cookie数据给带过去,服务器就可以根据cookie数据就能得到session对象
生活例子
一个店里 有一个会员制 我们办理给 店家会给我们一张会员卡 以后的消费老板只让会员卡,而不会去认人,卡上会有卡号 可以查看个人的信息 如卡上还有多少钱等等
四 .Session的时效性
① 为什么Session要设置时限
用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。
② 设置时限的难点
从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。
③ 服务器端给Session对象设置最大闲置时间
-
默认值:1800秒
最大闲置时间生效的机制如下:
会话什么时候结束? ① 客户端关闭(jsessionid这个cookie消失) ② 强制失效
protected void removeSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session = " + session);
session.invalidate();//强制失效
}
移到数据 session对象还是在 直到销毁session对象 在重新获取的时候 因为之前的对象已经销毁了 然后getsession会重新建一个session对象 然后在给一个新的cookie ③ 自动失效(达到最大空闲时间)
无操作40秒后