Cookie&Session机制详解

来源:互联网 发布:mac怎么切换输入法 编辑:程序博客网 时间:2024/06/11 09:23
1.会话技术简介
(1) 存储客户端的状态
     由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态。
(2) 会话技术
     从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
     会话技术分为Cookie和Session:
     Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端    可以清除cookie.
     Session:将数据存储到服务器端,安全性相对好,增加服务器的压力 .

2. Cookie:
(1) Cookie 机制采用的是在客户端保持 HTTP 状态信息的方案
(2) Cookie:
     ① Cookie 是在浏览器访问 WEB 服务器的某个资源时,由 WEB 服务器在 HTTP 响应消息头中附带传送给浏览器的一个小文本文件。
     ②  一旦 WEB 浏览器保存了某个 Cookie,那么它在以后每次访问该 WEB 服务器时,都会在 HTTP 请求头中将这个 Cookie 回传给 WEB 服务器。
     ③ 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
     ④  一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
(3) API:
//1. 创建一个 Cookie 对象Cookie cookie = new Cookie("cookieKey","cookieVal");//2. 把该 Cookie 对象回传给客户端浏览器response.addCookie(cookie);
//1. 获取 Cookie. 只能获取所有的 Cookie. 即一个 Cookie 的数组Cookie[] cookies = request.getCookies();//2. 获取具体的 Cookie 信息.for(int i = 0; i < cookies.length; i++){    Cookie cookie = cookies[i];    String name = cookie.getName();    String val = cookie.getValue();}
(4) 关于 Cookie 的两个比较重要的 API:
       setMaxAge(): 设置 Cookie 的有效时间. 单位为 秒.
          设置为 0, 则删除该 Cookie
          设置为 负数, 表示不再浏览器端的磁盘上存储该 Cookie
          设置为 正数, 表示存储的时间.
     setPath(): 设置 Cookie 的有效路径.
          默认情况下, 该 Cookie 仅适用于当前路径及当前路径的子路径
          可以调用 setPath() 方法来设置 Cookie 的有效路径.
(5) 使用 Cookie 实现简单免登陆的功能:
     有一个登陆页面. 输入用户名和密码之后, 提交到一个 Servlet 或 JSP, 在服务端比对 username 和 password. 若正确, 则登陆成功. 响应成功页面: success.jsp.
     关闭浏览器后, 直接访问 success.jsp, 正常情况下, 先查询是否有输入的 username 和 password, 若没有则重定向到登陆页面, 要求输入用户名和密码.
     若使用了 Cookie 的免登陆功能, 则: 检查是否有和登陆相关的 Cookie 传过来, 若有, 则验证从 cookie 中获取 username 和 password, 进行比对,若比对成功, 则免登陆.
     注意: 实际上, 浏览器可以选择不再接受服务器端的 Cookie. 则意味着没有办法进行回传. 此时网上购物, 登陆信箱都会失效.
//在Login.jsp页面中:<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>     <form action="success.jsp" method="POST">          Username: <input type="text" name="username"/>          <br>          Password: <input type="password" name="password"/>          <br>          <input type="submit" value="Submit"/>     </form></body></html>
//在Success.jsp页面中:<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>     <h4>Success Page</h4>     <%          String username = request.getParameter("username");          String password = request.getParameter("password");          //若 username 和 password 都是 null, 则尝试从 request 中来获取 Cookie          if(username == null && password == null){              Cookie [] cookies = request.getCookies();              //out.println("Cookie 数组的长度:" + cookies.length);              //out.print("<br>");              //取出需要的 Cookie. 只能通过遍历的方式, 根据 Cookie 的 name 进行筛选。              if(cookies != null && cookies.length > 0){                   for(Cookie cookie: cookies){                        String name = cookie.getName();                        if("username".equals(name)){                             username = cookie.getValue();                        }                        if("password".equals(name)){                             password = cookie.getValue();                        }                   }              }          }          if("abc".equals(username) && "123".equals(password)){              out.print("登陆成功! welcome:" + username);              //把用户名作为 Cookie 传回去.              response.addCookie(new Cookie("username",username));              //把密码作为 Cookie 传回去.              response.addCookie(new Cookie("password",password));          }else{              response.sendRedirect("login.jsp");          }     %></body></html>
3.Session
     Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间    存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。
(1) 获得Session对象
     HttpSession session = request.getSession();
     此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有    的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)
(2) 怎样向session中存取数据(session也是一个域对象)
     Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
     session.setAttribute(String name,Object obj);
     session.getAttribute(String name);
     session.removeAttribute(String name);
(3) session生命周期
     创建:第一次指定request.getSession();
     销毁:服务器关闭、session失效/过期、手动session.invalidate();
     session作用范围:默认一会话中
(4)  跟踪 HttpSession 对象的机制:
     ① 若第一个访问 WEB 应用的某一个需要 HttpSession 的页面, 此时服务端会创建一个新的 HttpSession 对象, 把 HttpSession 的 id 以一个 Cookie 的方式返回给客户端
     ② 在发送请求的时候, 根据 Cookie 的机制, 会自动的把当前的 Cookie 在传回去, 于是就自动的找到了先前的那个 HttpSession 对象
     ③ Cookie 的 name 值为 JSESSIONID
(5) Session 的应用
     ① 在登陆后, 存储用户的信息.
     ② 可以解决表单的重复提交.
     ③ 使用验证码: 原理和表单重复提交一模一样! 

4.cookie 和session 的区别:
(1) cookie数据存放在客户的浏览器上,session数据放在服务器上。
(2) cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session。
(3)  session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 ,考虑到减轻服务器性能方面,应当使用COOKIE。
(4) 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
(5) 所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中