Cookie
是客户端(浏览器端)会话技术
,而Session
是服务端会话技术
,而。本篇文章将系统的说明Cookie与Session机制及其应用场景。
会话管理的产生
:由于HTTP的无状态性,使得会话管理或者会话跟踪成为Web应用开发一个无法避免的问题。默认情况一下,一个WEB服务器是无法区分一个HTTP请求是否为第一次访问。
会话
:一次会话中包含多次请求和响应
一次会话
:浏览器第一次给服务器发送请求,会话建立,直到有一方断开位置
会话的功能
:在一次会话的范围内的多次请求间共享数据
Cookie
,将数据保存在客户端(浏览器)Session
,将数据保存在服务器
Cookie
:客户端会话技术,将数据保存在客户端(浏览器),Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此Cookies可存储在多个页面间传递信息。Cookie作为HTTP header的一部分,其传输由HTTP协议控制,此外,可以控制Cookies的有效时间。浏览器通常支持每个网站高达20个Cookies。
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
Cookie[] request.getCookies()
// 根据name一个一个进行比较
Cookie[] cookies = request.getCookies();
String name = "xxx";
String value;
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals(name)) {
value = c.getValue();
}
}
}
删除Cookie
后需要给浏览器发送Cookie已被删除的结果(resp.addCookie(rmCookie));)
// 将value置空
Cookie rmCookie = new Cookie(name, "");
// 将存活时间置0
rmCookie.setMaxAge(0);
// 向浏览器发送被删除的Cookie
resp.addCookie(rmCookie);
Cookie的实现原理
第一次
请求服务器时,如果服务器需要记录用户状态,就在响应用户请求时发送一段Cookie信息。客户端浏览器保存该Cookie信息,当用户再次访问该网站时,浏览器会把Cookie做为请求信息的一部分提交给服务器。服务器检查Cookie内容,以此来判断用户状态,服务器还会对Cookie信息进行维护,必要时会对Cookie内容进行修改。(更多关于Cookie实现的文字描述请参考:Cookie实现原理)保存在浏览器端
的。可以
,创建多个Cookie对象,使用response对象的addCookie()多次发送即可。默认情况下
,当浏览器关闭后
,Cookie数据被销毁设置Cookie声明周期
,使Cookie持久化用Cookie对象调用setMaxAge(int seconds)方法
正数:将Cookie数据写到硬盘文件中持久化存储,second表示cookie存活时间,单位是秒
负数:默认值为-1,存在浏览器内存中,浏览器一关闭就销毁Cookie数据
零:删除Cookie数据
不可跨域名性
(Cookie共享问题)Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
域名
。Google与Baidu的域名 不一样,因此Google不能操作Baidu的Cookie。
默认情况下Cookie不能共享
setPath(String path):设置Cookie的获取范围,默认情况下设置当前项目的虚拟目录,如果要共享,则将path设置为:"/"。
setDomain(String path):如果设置一级域名相同,那么多个服务器间Cookie共享
Tomcat8
之前,Cookie中不能直接存储中文(Cookie中保存中文只能编码。一般使用UTF-8编码即可),在Tomcat8之后,Cookie支持中文数据。单个Cookie的大小有限制
(一般4K左右,和浏览器有关)以及对同一个域名下的总Cookie数量也有限制
(一般20个左右,和浏览器有关)少量的不太敏感的数据
用户免登录
(在不登录的情况下完成服务器对客户端的身份识别,主要作用)
Session
:服务端会话技术,将数据保存在服务器,在一次会话的多次请求间共享数据。
HttpSession
:Servlet对Session机制的一种封装
HttpSession httpSession = request.getSession();
// 方法重载,如果没有,返回null
HttpSession httpSession = req.getSession(false);
// 方法重载,如果没有,创建一个
HttpSession httpSession = req.getSession(true);
Object
类型的,区别于Cookie只能使用String。因此Session可以存储任意类型
、任意大小
的数据。 httpSession.setAttribute(String name, Object value);
Object value = httpSession.getAttribute(String name);
HttpSession的实现原理
默认情况下,不是同一个
虽然session默认生成的Cookie随着浏览器的关闭而销毁,但通过自定义相同的JSESSIONID,从而实现两次访问相同的session
,至少,这两次访问是在session还未过期时,若session已过期,就不能实现相同了
) //希望客户端关闭后再次获取Session能相同
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
默认情况下,不是同一个
● session的
钝化
:当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下。
● session的活化
:当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象。
● 想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口
● I注意:DEA可以完成钝化但是无法活化成功,要依靠本地的Tomcat服务器去完成钝化和活化,但是实际开发中也不会在IDEA里面部署项目,所以关系不大。
// 1、web.xml配置文件中更改配置信息
20
// 2、调用setMaxInactiveInterval()方法,在用户30分钟之内无活动,设置过期,单位秒
httpSession.setMaxInactiveInterval(60 * 30);
httpSession.invalidate();
任意类型
、任意大小
的数据(value为Object)