会话跟踪技术
会话:一个浏览器在不关闭的前提下,发送多次请求,访问同一服务器,这些请求之间称为同一次会话。
浏览器关闭(注意不是单个标签页的关闭),即视为会话结束。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
一次会话的多次请求内,数据共享的问题
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session
Cookie
浏览器第一次访问后台时,后台发送Cookie给浏览器,Cookie中有一些数据,浏览器收到后会进行保存。
// 第一次请求后台时, 后台创建Cookie对象, 发送给到客户端
Cookie ck = new Cookie("name","张三");
resp.addCookie(ck);
在接下来的请求中,浏览器会带上这个Cookie。
// 后台获取请求中携带的Cookie数据
Cookie[] cookies = req.getCookies();
for(Cookie p : cookies){
String name = p.getName();
String value = p.getValue();
}
Cookie默认情况下,存储在浏览器内存中,存活时间为一个会话,浏览器关闭,内存释放,则Cookie被销毁
Cookie ck = new Cookie("name","张三");
ck.setMaxAge(60*60*24*7); // 设置存活时间 7 天
resp.addCookie(ck);
Session
一次会话的多次请求之间,不停的获取session,获取到的都是同一个 session对象。共享数据。
但是浏览器关闭之后,重新开启,再进行请求,就得到的是另一个Session对象了。
session的数据在服务器那儿。
@WebServlet("/demo1")
// 存 数据 到 session 中
HttpSession session = req.getSession();
session.setAttribute("name","张三");
@WebServlet("/demo2")
// 获取 session 中的数据
HttpSession session = req.getSession();
Object name = session.getAttribute("name");
System.out.println(name);
Session的钝化:服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
Session的活化:再次启动服务器后,从文件中加载数据到Session对象
Session的销毁:
// 可以在 web.xml 中指定 session在多长分钟后自动销毁
// 默认是 30分钟
<session-config>
<session-timeout>40</session-timeout>
</session-config>
或者调用Session对象的 invalidate()方法,即可销毁
Cookie 和 Session的区别
Cookie在浏览器那里,Session在服务器那里。
浏览器一关毕,Session就相当于没了。
默认情况下,session的id(JSESSIONID)会存到cookie中,返回给浏览器,但是这个cookie的有效时间为,关闭浏览器前有效
因此,重启浏览器就无法获取相同的sessionid,这种情形下,再去进行访问,后台的getSession()
就无法获取到同一个session
对象。
隐私数据存到session中,长期存储的用Cookie