---------------------------------------------------------------------------
会话:用户打开浏览器,连续进行多个操作,关闭浏览器 整个过程称为一个会话
* 会话的数据,需要保存数据对象,而且该对象针对每个会话独立保存数据 ,request、servletContext 是不能满足需求
cookie:保存用户数据到客户端浏览器中
session:将数据保存用户浏览器对应Session对象中,该对象保存在服务器端
Cookie的实现原理
1、客户端提交会话数据到服务器,服务器选择在响应中保存cookie信息 在响应中添加头 set-Cookie : key=value
2、客户端接收set-Cookie后,将cookie信息 保存浏览器中3
3、客户端访问服务器端下一次请求,会自动携带之前保存cookie信息,在请求头中添加cookie:key=value
4、服务器端就可以通过 cookie请求头信息,获得cookie数据
* 例如:京东购物车
cookie入门小案例。保存上次访问时间
* cookie 格式 key=value,key=value
1、Cookie cookie = new Cookie("last", now + "");
response.addCookie(cookie);
结果在响应头信息中添加:Set-Cookie: last=1346035749421
2、第二次请求时,携带头信息:Cookie: last=1346035749421
request.getCookies() ; 获得cookies数组 ,判断数组是否为null,如果为null 证明cookie一定没有
cookies 不为空,从数组中查找需要信息
for(Cookie c : cookies){
if(c.getName().equals("xxxx")){
// 找到了你需要cookie
}
}
Cookie API
一、服务器向客户端写cookie信息
1、cookie的创建
Cookie c = new Cookie(name,value); // 生成响应头信息 set-cookie: name=value,name=value,name=value...
* 对于value可以读取 getValue setValue
* 对于name 只读 getName
2、需要将cookie写到客户端
response.addCookie(c);
3、关于会话cookie和持久cookie ,cookie写到浏览器端,默认保存在浏览器内存缓存区中(会话cookie),当关闭浏览器后,会话cookie信息就会删除
如果需要在关闭浏览器后,cookie信息还存在,将cookie信息持久化到硬盘上(持久cookie) --- 设置cookie的maxAge
** 浏览器临时文件区中,可以查看 (持久cookie会在过期后 失效)
4、path和domain 的设置 ,限制访问哪个站点或者哪个资源 携带cookie
domain 默认是域名,当前网站域名 .itcast.cn 、.baidu.com
访问baidu,设置domain为.baidu.com ------ 第一方cookie
访问baidu,设置domain为.google.com ------ 第三方cookie
* 大多数浏览器 阻止第三方cookie
有效访问路径 path ,如果访问资源路径 和 cookie设置有效访问路径 不符合,请求中将不会携带cookie信息
cookie.setPath("/aaa");
Set-Cookie: last=1346038104734; Expires=Wed, 26-Sep-2012 03:28:24 GMT; Path=/aaa
访问资源路径 :http://localhost/day7/lastvisit 与 path:/aaa不符合 不会携带cookie
** 默认path路径 就是生成cookie访问路径 http://localhost/day7/lastvisit 生成cookie , path 就是 /day7
举例:
生成cookie: http://localhost/aaa/generateCookie
**** 设置path:/bbb 也可以 /
使用cookie: http://localhost/bbb/useCookie
小结:完整设置cookie代码
Cookie c = new Cookie(name,value);
c.setMaxAge(...);
c.setPath(...);
response.addCookie(c);
二、服务器读取客户端提交cookie信息
1、request.getCookies 获得cookie数组
2、从数组中查找需要cookie
***** 如果cookies为null cookie一定没有,如果不为null ,也不一定有你需要的
/**
* 查找cookie 工具方法
*
* @param cookies
* @param name
* @return
*/
public static Cookie findCookie(Cookie[] cookies, String name) {
if (cookies == null) {
// cookie 就不存在
return null;
} else {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(name)) {
// 找到
return cookie;
}
}
// 没找到
return null;
}
}
应用:用程序删除持久cookie,将maxAge设置为 0
-------------------------------------------------------------------------------------------------------
Session和Cookie 相比,Cookie 数据保存客户端,Session数据保存服务器端
Cookie 好处:保存客户端,不占用服务器资源 (记住用户名密码、上次访问时间 、商品浏览记录 ...) 缺点:安全性
Session 好处:数据保存服务器端,更加安全 ,缺点:占用服务器资源,当Session数据非常多时,服务器压力非常大
*** 服务器集群:需要考虑Session同步
服务器会为每个浏览器 创建单独Session对象,Session对象用来保存与对应浏览器相关会话数据
Browser ---- HttpSession
Session原理
1、当客户端访问服务器,第一次 request.getSession() API得到执行,随机创建Session对象,为对象创建唯一编号 id
2、服务器会将创建Session 的编号 id 以Cookie形式 发送给客户端
3、客户端接收 session的编号,保存起来(会话级别、持久级别)
4、客户端下次访问服务器,因为cookie中含有session的id ,会自动携带session的id
5、服务器端,从cookie中获得session的id,并且request.getSession()时,根据session的id查找到服务器端对应Session对象
关闭浏览器再打开,Session中数据还在不在,cookie持久的,获得之前session的id ---- 找到相应信息
**** cookie是会话级别,关闭浏览器后丢掉 session的id ,服务器端session数据 还在
**** 浏览器关闭了,Session的数据还在不在(Session数据就删除了) ?? 浏览器关闭 与Session存在无关 ,丢失保存在cookie中 session的id
第一次访问session1 ---- 响应:Set-Cookie: JSESSIONID=B755C57D0E95D1C6F76288195F8CE257; Path=/day7
访问session2 ------- 请求 :Cookie: last=1346038269703; JSESSIONID=B755C57D0E95D1C6F76288195F8CE257
IE6 : 关闭浏览器再打开,session 的 id 丢失了,显示 null
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
cookie.setPath("/day7");
response.addCookie(cookie);
*** 手动设置jsessionid持久化
案例:商品购物车
如果客户端禁用cookie,会怎么样 ?服务器Session对象还是存在的 ,客户端无法找到Session
*** cookie 禁用解决 ,在url地址上 拼接jsessionid
http://localhost/day7/session/cart.jsp;jsessionid=5509175E258A27EBAA3BF972E5D309EF (分号 ; 不是 ?)
使用response 提供现成API : encodeURL
*** 禁用cookie 使用所有url 必须都进行重写,只要有一个没重写,session丢失 ,无法获得丢失session的数据
Session生命周期 :
1、创建 :request.getSession() (没有jsessionid找不到对应Session)
2、失效 :
1) 服务器正常关闭,重启后,session数据还有,中止服务器,启动,session数据丢失
** 正常关闭服务器,session中数据会被序列化到 tomcat/work 目录,重启后重新加载
2) 自动过期 ,当session持续一段时间没有使用,服务器就会自动删除session对象
tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
默认session过期时间 30分钟
API 进行设置 session.setMaxInactiveInterval(int interval) 单位秒
3) 手动销毁session ---- session.invalidate() 销毁当前session对象,清除里面所有数据
Session保存用户相关数据(身份信息)----- session最主流应用:登陆、权限 ....
案例:使用一次性验证码的登录案例
1、login.jsp 使用验证码,点击切换(在图片上点击)
2、一次性验证码 ,生成验证码时,将生成内容 保存session
3、LoginServlet 判断验证码、判断用户名和密码(如果用户名和密码正确,将用户信息保存session)
4、welcome.jsp 可以通过判断session中是否含有用户信息,得知用户是否登录
掌握:一次性验证码原理 ,如何判断用户已经登陆
Servlet的三种数据范围(允许程序在服务器端,保存一个数据到Servlet内部一个对象中),共同方法
setAttribute 将数据存入
getAttribute 将数据取出
removeAttribute 删除一个数据
** 数据范围相当于 一个map结构
三个数据范围(生命周期由长到短):ServletContext、HttpSession、ServletRequest
*** 保存数据目录,在服务器端 两个多个程序之间共享数据
ServletContext ,每个web应用只有一个ServletContext对象,服务器启动时创建,服务器停止时销毁
* 保存全局唯一数据:站点访问次数 、在线人数、数据库连接池
HttpSession, 每个会话创建一个单独HttpSession对象,保存会话信息
* 保存与用户相关数据:用户登录信息、购物车信息 ...
ServletRequest , 每次请求创建 ServletRequest对象(HttpServletRequest), 当响应结束后,request对象就销毁了
* 保存数据到request中:在Servlet得到数据,传递给JSP显示 (错误信息)
优先使用生命周期短的,内存可以尽快得到释放,不占用服务器资源
-------------------------------------------------------------------------------------------------------------
小结:
1、会话管理技术Cookie 和Session 有何区别?
2、cookie和session原理
3、会话cookie和持久cookie
4、path作用
5、第一方cookie和第三方cookie是什么?
6、cookie案例 : 商品访问记录 (CookieUtils 工具类)
7、关闭浏览器再打开,session还能不能使用?如果想继续使用如何做?
8、客户端禁用cookie,还能用session吗?URL重写(原理)
9、session案例: 商品购物车
10、session案例:一次性验证码登陆
11、Servlet三种数据访问范围 ServletContext HttpSesssion ServletRequest