HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的,服务器无法知道连接是否来自于同一个客户端。会话技术就是为了解决这个问题,通俗来讲,为了证明你就是你
客户端会话技术:Cookie
服务器端会话技术:Session
// 创建Cookie对象
Cookie cookie = new Cookie("name", "tom");
// 添加Cookie
response.addCookie(cookie);
// 获取Cookie
Cookie[] cookies = request.getCookies();
// 遍历容器
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "=" + cookie.getValue());
}
会话跟踪的发起端是服务器
默认情况下浏览器关闭就销毁,浏览器获得服务器响应后获得Cookie,只要不关闭就存在
cookie.setMaxAge(seconds);
1、默认情况下,访问当前项目下(同一域名)的任何资源,都会携带cookie
2、设置携带范围
cookie.setPath(String path);
//只有访问这一个资源的时候,才会携带cookie
setPath("具体的资源路径")
//只要是该服务器下所部署的项目,访问资源的时候都可以携带cookie
setPath("/")
session.getId()
获取JSESSIONID
的Cookie信息Set-Cookie:JSESSIONID=7809798C607C086C57C65C576C858787
JSESSIONID
的Cookie,取出ID,根据ID获取Session//根据请求的Cookie获取Session对象,如果不存在则创建新的Session
HttpSession session = request.getSession();
// 根据请求的Cookie获取Session对象,如果不存在则返回null
HttpSession session = request.getSession(false);
// 向session域对象中存储数据
session.setAttribute("key", object);
// 从session域对象中获取数据
Object obj = session.getAttribute("key");
// 从session中删除数据
session.removeAttribute("key");
默认浏览器关闭,此Cookie消失
如果浏览器关闭了之后,在浏览器缓存中存储的JSESSIONID=XXXOOO
的数据,就会消失,下次再去访问服务器使,就不会携带JSESSIONID
的cookie
如果想要关闭浏览器下一次访问还携带JSESSIONID
的cookie的话,可以通过设置Cookie的生命周期来实现
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(seconds);
response.addCookie(cookie);
因为浏览器没有关闭,所以JSESSIONID的cookie没有消失,一直存在
我们如果非正常关闭服务器,session就消失了,当我们再次开启服务器,通过浏览器访问,cookie会携带,JSESSIONID也有,但是却不配不到session的ID值,所以在服务器端重新创建一个session对象,并且重新生成一个session的id值
我们如果正常关闭服务器,session也会消失,但是它会进行钝化(序列化,将session中数据存储到本地磁盘),当我们再次开启服务器,session会被活化(激活,反序列化,将本地磁盘的数据还原成java中的对象),通过浏览器访问,cookie会携带,JSESSIONID也有,ID值也匹配了,数据自然就获取到了,不会创建新的session对象
SESSIONS.ser
的形式存储在tomcat/work
目录下。SESSIONS.ser
文件,从中恢复之前保存起来的Sessio 对象,这个过程叫做Session的活化。Serializable
接口,还有要注意的是只有在服务器正常关闭的条件下,还未超时的Session才会被钝化成文件。当Session 超时、调用invalidate()
方法或者服务器在非正常情况下关闭时,Session 都不会被钝化,因此也就不存在活化。SESSIONS.ser
文件时,不会因为超过Session过期时间而消失,这个文件会一直存在,等到下一次服务器开启时消失。1、关闭服务器
2、调用session.invalidate();
方法
Session的生命时长,默认30分钟,Tomcat会开启一个后台线程每隔段时间检查Session的有效性,并删除过期的Session。
int getMaxlnactivelnterval()
,获取Session过期时间,返回值以秒为单位。
session.setMaxInactiveInterval(seconds)
方法进行设置,参数以秒为单位,值为零或负数,则表示会话将永远不会超时。web.xml
配置:参数以分钟为单位,值为零或负数,则表示会话将永远不会超时。<session-config>
<session-timeout>minutes</session-timeout>
</session-config>