Cookie & Session


 ---------------------------------------------------------------------------
 会话:用户打开浏览器,连续进行多个操作,关闭浏览器 整个过程称为一个会话 
 * 会话的数据,需要保存数据对象,而且该对象针对每个会话独立保存数据 ,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 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值