cookie 和 session
会话技术
1. 会话:一次会话中包含多次请求和响应;
** 一次会话:浏览器第一次给服务器资源发送请求,会话建立; 直到有一方断开为止;
2. 功能:在一次会话的范围内的多次请求,共享数据;
3. 方式:
a. 客户端会话技术:Cookie
b. 服务端会话技术:session;
## cookie
1. 概念:
客户端会话技术,将数据保存在客户端;
2. 在Servlet中,Cookie的存取
* 服务端向客户端发送Cookie
Cookie cookie = new Cookie("msg","Cookie测试应用");
response.addCookie(cookie);
* 服务端读取客户端提交的Cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+" --> "+value);
}
3. 实现原理
* 基于响应头 set-cookie 和 请求头 cookie 实现;
4. cookie 的细节
a. 一次可不可以发送多个cookie;
* 可以创建多个cookie 对象,并调用 addcookie添加;
b. cookie 在浏览器中保存多久呢?
* 默认情况下,当浏览器关闭后,Cookie数据被销毁;
* 持久化存储
* setMaxAge( int seconds)
> 正数:将Cookie数据写到硬盘的文件中,持久化存储;cookie存活时间;seconds 秒后删除cookie文件
> 负数: 默认值;
> 0: 删除cookie信息
c. cookie能不能保存中文?
* 在 tomcat 8 之前,cookie中不能直接存储中文数据; (转码后可存储,一般转为url编码)
在 tomcat 8 之后,cookie支持中文数据;
d. cookie共享问题?
* 假设在tomcat服务器中部署了多个web项目,那么在这些web项目中, cookie能不能共享?
* 默认情况下,cookie 不共享;
* setPath(String path): 设置 cookie 的获取范围。默认情况下,设置墚前的虚拟目录;
如果要共享,则可以将path设置为 "/";
* 不同的 TomCat 服务器之间 cookie 共享问题;
* setDomain(String path): 如果设置一级域名相同,则 多个服务器之间cookie可以共享;
>> setDomain(".baidu.com"), 那么 tieba.baidu.com 和 news.baidu.com 之间 cookie可以共享;
5. cookie 特点
a. cookie 存储数据在客户端浏览器;
b. 浏览器对于单个cookie的大小有限制 (4kb);对同一个域名下的总cookie数量也有限制 (一般20个以内);
** 作用
1. cookie 一般用于存储少量不太敏感的数据;
2. 在不登陆的情况下,完成服务器对客户端的身份识别;
## Session
1. 概念:服务端会话技术,在一次会话的多次请求中共享数据,将数据保存在服务器端的对象中( HttpSession );
2. Session的设置
* HttpSession session = request.getSession();
session.setAttribute("msg","你好呀Session");
Session的读取
* HttpSession session = request.getSession();
Object msg = session.getAttribute("msg");
System.out.println(msg);
3. Session实现的原理
>> Session的实现,是依赖于Cookie的;
通过 cookie中配置 JSESSIONID 参数来标识 Session对象;
4. Session的细节
a. 当客户端关闭后,服务器不关闭,二次获取的Session是否为同一个?
>> 默认情况下是不一样的
>> 若需要关闭客户端后再次打开,仍然是同一个Session, 可按如下方法配置;
b. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
>> 不是同一个,但需要确保数据的不丢失,tomcat自动完成了如下的工作;
> session的钝化: 在服务器正常关闭之前,将session对象系列化到硬盘上;
> session的活化:在服务器启动后,将session文件转化为内存中的session对象;
>> session的钝化与活化,在IDEA中无法完成,需要在tomcat服务来完成;
IDEA下无法完成的的原因是,每次运行时,IDEA会删除 work目录,而session序列化的文件就在work目录中;
c. Session什么时候销毁
1>. 服务器关闭时;
2>. session对象调用 invalidate();
3>. session默认失效时间为 30 分钟
在 tomcat安装目录/conf/web.xml ; 可以依据实际项目应用需求配置
5. Session的特点
a. session用于存储一次会话的多次请求的数据,存在服务器;
b. session可以存储任意类型, 任意大小的数据;
* session 与 cookie 的区别
> session 存储数据在服务器端, cookie在客户端;
> session 没有数据大小限制,cookie有;
> session 数据安全,cookie相对来说没有session安全;
## 关于服务端的 转发 与 重定向
转发:
request.getRequestDispatcher("目标URL").forward(request, response);
转发过程中,可以通过 request.setAttribute ("参数名", "参数值") 来共享数据;
重定向
response.sendRedirect(request.getContextPath()+"目标URL");
重定向时,客户端会重新发起一次请求,可以通过 Session 来共享数据;