Cookie

HTTP协议是无状态的的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。Cookie和Seesion,就是这样的机制,可以弥补HTTP协议的无状态的不足。

Cookie是客户端技术,程序把每个客户的数据以Cookie的形式写给用户各自的浏览器。当用户私用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样web资源处理的就是用户各自的数据了。

Session是服务器端技术,服务器在运行时可以为每个用户的浏览器创建一个其独享的Session对象,由于Session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的资源放在各自的Session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的Session中取出数据为用户服务。


一、Cookie基础


1、工作原理:

HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户的身份。Cookie就像是给客户端颁发的一个通行证。每个客户浏览器一个,无论谁访问必须携带自己的通行证。这样服务器就能从通行证上确认客户身份了。


2、基本知识:

1)Cookie是保存在客户端的内容,每个浏览器有各自的编号,区分浏览器,浏览器不同,信息不共享。

2)写入的信息只能是文本文档。不支持中文,如支持,必须使用从新转码。

3)客户端可以阻止服务器写入。

4)Cookie不能跨域名。服务器只能拿自己的web应用写入的东西。

5)浏览器的Cookie数量是有限的,大概是30-50个,每个为4K左右,每个浏览器各有不同。


3、实现:

1)客户端请求服务器,可以使用 response 向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再去访问该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查Cookie,以此来辨认用户状态。服务器还可以根据需要修改 Cookie 的内容。

2)可以在浏览器地址栏数据 javascript:alert(document.cookie) 就可以了。document.cookie获取所有的。


二、Cookie操作


1、基本知识:

1)java中把Cookie封装成javax.servlet.http.Cookie类。服务器通过操作Cookie类对象对客户端Cookie进行操作。

2)Cookie对象使用key-value 属性对的形式保存用户状态。一个 request 或者 response 同时使用多个Cookie。

3)创建Cookie :Cookie cookie = new Cookie(String key, String value)。如果key和value为中文(Unicode字符),需要使用URLEncoder进行编码。如果为二进制,则需要使用Base64编码。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 1-创建Cookie  
  2. String key = "aaa";  
  3. String value = "111";  
  4. Cookie cookie = new Cookie(key, value);  
  5.   
  6. // 1-2 创建中文, 使用URLEncoder编码 和 URLDecoder解码  
  7. Cookie cookieChina = new Cookie(URLEncoder.encode("中文""UTF-8"), URLEncoder.encode("中文""UTF-8"));  


4)向客户端设置Cookie : response.addCookie(Cookie cookie) 。

5)获取客户端的Cookie : Cookie[] cookies = request.getCookies()(以Cookie[]数组形式返回)。

6)获取Cookie 的name和value: String tName = Cookie.getName(); String tValue = Cookie.getValue();

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 3-从客户端获取  
  2. Cookie[] cookies = request.getCookies();  
  3. if (cookies != null && cookies.length > 0) {  
  4.     for (Cookie tCookie : cookies) {  
  5.         String tName = tCookie.getName();  
  6.         String tValue = tCookie.getValue();  
  7.         int maxAge = tCookie.getMaxAge();//有效期  
  8.           
  9.           
  10.         logger.debug("Cookie的name : " + tName + " | Cookie的value : " + tValue+ " | Cookie的有效期:  "+ maxAge);  
  11.           
  12.     }  
  13. }  


7)设置Cookie的时间 : cookie.setMaxAge(maxAge); 值的类型:

A、正数:表示Cookie在maxAge之后失效,cookieChina.setMaxAge(Integer.MAX_VALUE)-永久有效

B、负数(-1):临时Cookie,浏览器关闭即失效,不保存。-1是默认值。

C、0-删除该Cookie。Cookie没有删除的方法,可以设置maxage为0;修改Cookie: 可以添加一个同名的Cookie用于覆盖前一个来修改Cookie。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 4-Cookie的删除与修改  
  2. Cookie cookie2 = new Cookie("time","201401008");  
  3. cookie2.setMaxAge(0);//删除Cookie,设置maxage=0即可删除  
  4. response.addCookie(cookie2);  
  5.   
  6. response.addCookie(new Cookie("time","20150909"));//同名Cookie,修改前一个cookie的作用  



8)Cookie的域名: Domain属性(IE是禁止的,会有安全问题)。

A、Cookie具有不可跨域名性。www.gogle.com 和 www.baidu.com不可交互Cookie。同一域名下两个二级域名 如 http://www.baidu.com 和 http://music.baidu.com 也 不同交互使用Cookie。如果想所有的 baidu.com 名下的二级域名都可以使用该 Cookie, 需要设置Domain属性

B、Domain属性,必须以(“.”)开始。另外,name相同但是domain 不同的两个Cookie是两个不同的Cookie。

C、如果想要两个域名完全不同的网站共有 Cookie, 可以生成两个Cookie, domain属性分别为两个域名,输出到客户端。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 5-Cookie的域名  
  2. Cookie cookie3 = new Cookie("time","201401008");  
  3. cookie3.setDomain(".baidu.com");//设置域名,意思是所有bai.com下的二级域名都可以访问。必须以“.”开始  
  4. cookie3.setPath("/");//设置所有路径都可以使用  
  5. cookie3.setMaxAge(Integer.MAX_VALUE);   //设置有效期  
  6. response.addCookie(cookie3);  

9)Cookie的路径: path属性

A、path属性决定了访问Cookie的路径,即contextPath路径。例如,如果只允许/JavaWeb/下的程序使用Cookie,可以这么写:

B、path属性必须以“/XXX/”这种形式,当只有“/”时,表示所有路径都可以访问该Cookie。

C、一个Servlet/JSP 设置的cookie 只能被与这个Servlet/JSP在同一路径下或子路径下的Servlet/JSP访问。父路径和其他路径无法获取。如sesson/test/b.jsp可以获取到路径session/a.jsp的 Cookie,而不能获取/session/b/的Cookie。

D、这边的路径不是指文件的存放真实路径,而是指url路径,是指<url-pattern>设置的路径。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 6-Cookie的路径  
  2. Cookie cookie4 = new Cookie("time","201401008");  
  3. cookie4.setPath("/Javaweb/");//只有Javaweb/下的可以访问  
  4. response.addCookie(cookie4);  


10)Cookie的安全属性:secure属性

如果不希望Cookie在HTTP等非安全协议中传输,可以设置cookie的secure属性属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 7-Cookie的安全属性  
  2. Cookie cookie5 = new Cookie("time","201401008");  
  3. cookie5.setSecure(true);//true,在HTTP中无法获取本Cookie  

2、JS操作Cookie:

1)格式:在js中Cookie的格式:account=111; ssid=222; JSESSIONID=7E99EBDC3CA63AB849D1493FBCCC5159,类似于map类型。

2)获取:document.cookie获取所有的Cookie。

3)获取单个固定的Cookie,可以自己封装方法:


[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 获取Cookie 
  3.  */  
  4. var getCookie = function(name) {  
  5.     var str = document.cookie;  
  6.     if (!str || str.indexOf(name + "=") < 0)  
  7.         return;  
  8.     var cookies = str.split("; ");  
  9.     for (var i = 0; i < cookies.length; i++) {  
  10.         var cookie = cookies[i];  
  11.         if (cookie.indexOf(name + "=") == 0) {  
  12.             var value = cookie.substring(name.length + 1);  
  13.             return decodeURI(value);  
  14.         }  
  15.     }  
  16. };  

4)、创建Cookie的方法,我们也可以封装成一个方法:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 设置Cookie 
  3.  */  
  4. var setCookie = function(name, value) {  
  5.     // document.cookie = name + "=" + encodeURI(value);  
  6.     var expires = (arguments.length > 2) ? arguments[2] : null;  
  7.     var path = (arguments.length > 3) ? arguments[3] : null;  
  8.     var domain = (arguments.length > 4) ? arguments[4] : null;  
  9.     var secure = (arguments.length > 5) ? arguments[5] : false;  
  10.     document.cookie = name  
  11.             + "="  
  12.             + encodeURI(value)  
  13.             + ((expires == null) ? "" : ("; expires=" + expires  
  14.                     .toGMTString()))  
  15.             + ((path == null) ? "" : ("; path=" + path))  
  16.             + ((domain == null) ? "" : ("; domain=" + domain))  
  17.             + ((secure == true) ? "; secure" : "");  
  18. };  


3、Jquery操作Cookie:需要下载jquery.cookie.js,使用起来非常方便。

1)简单设置Cookie :  设置一个name-Cookie的名字,value-Cookie的值。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. $.cookie("name""value");   


2)设置其他参数:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //设置完整的cookie  
  2. $.cookie("name""sam-sho",{  
  3.                             expires : 10,//有效期,单位为天  
  4.                             path : "/",  
  5.                             domain : "jquery.com"  
  6.                             secrue : true  
  7.                             });    
[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //设置精细的时间  
  2. var cookietime = new Date();   
  3. cookietime.setTime(date.getTime() + (60 * 60 * 1000));//coockie保存一小时   
  4. $.cookie("sam""sam-sho",{expires:cookietime});   


3)读取Cookie :读取名字为sam的Cookie。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. $.cookie("sam")  


4)删除Cookie :删除名称为 sam 的Cookie,只要把value设置成null。注意:必须使用与之前设置的相同的路径(path)和域名(domain),才能正确删除。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. $.cookie("sam",null);   


三、实际案例。


1、实例1::永久登录。

1)纯JSP实现:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" pageEncoding="UTF-8" isErrorPage="false" %>  
  2. <jsp:directive.page import="java.security.MessageDigest"/>  
  3. <%!  
  4.     // 密钥  
  5.     private static final String KEY = ":cookie@helloweenvsfei.com";  
  6.   
  7.     // MD5 加密算法  
  8.     public final static String calcMD5(String ss) {  
  9.         
  10.        String s = ss==null ? "" : ss;  
  11.         
  12.        char hexDigits[] = { '0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f' };  
  13.        try {  
  14.         byte[] strTemp = s.getBytes();  
  15.         MessageDigest mdTemp = MessageDigest.getInstance("MD5");  
  16.         mdTemp.update(strTemp);  
  17.         byte[] md = mdTemp.digest();  
  18.         int j = md.length;  
  19.         char str[] = new char[j * 2];  
  20.         int k = 0;  
  21.         for (int i = 0; i < j; i++) {  
  22.          byte byte0 = md[i];  
  23.          str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
  24.          str[k++] = hexDigits[byte0 & 0xf];  
  25.         }  
  26.         return new String(str);  
  27.        } catch (Exception e) {  
  28.         return null;  
  29.        }  
  30.     }  
  31.   
  32. %>  
  33. <%  
  34.     request.setCharacterEncoding("UTF-8");  
  35.     response.setCharacterEncoding("UTF-8");  
  36.       
  37.     String action = request.getParameter("action");  
  38.       
  39.     if("login".equals(action)){  
  40.           
  41.         String account = request.getParameter("account");  
  42.         String password = request.getParameter("password");  
  43.         int timeout = new Integer(request.getParameter("timeout"));  
  44.           
  45.         // 把帐号连同密钥使用MD5后加密后保存  
  46.         String ssid = calcMD5(account + KEY);  
  47.                   
  48.         // 把帐号保存到Cookie中 并控制有效期  
  49.         Cookie accountCookie = new Cookie("account", account);  
  50.         accountCookie.setMaxAge(timeout);  
  51.           
  52.         // 把加密结果保存到Cookie中 并控制有效期  
  53.         Cookie ssidCookie = new Cookie("ssid", ssid);  
  54.         ssidCookie.setMaxAge(timeout);  
  55.           
  56.         response.addCookie(accountCookie);  
  57.         response.addCookie(ssidCookie);  
  58.           
  59.         // 重新请求本页面  
  60.         response.sendRedirect(request.getRequestURI() + "?" + System.currentTimeMillis());  
  61.         return;  
  62.     }  
  63.     else if("logout".equals(action)){  
  64.   
  65.         // 删除Cookie中的帐号  
  66.         Cookie accountCookie = new Cookie("account""");  
  67.         accountCookie.setMaxAge(0);  
  68.           
  69.         // 删除Cookie中的加密结果  
  70.         Cookie ssidCookie = new Cookie("ssid""");  
  71.         ssidCookie.setMaxAge(0);  
  72.   
  73.         response.addCookie(accountCookie);  
  74.         response.addCookie(ssidCookie);  
  75.   
  76.         // 重新请求本页面  
  77.         response.sendRedirect(request.getRequestURI() + "?" + System.currentTimeMillis());  
  78.         return;  
  79.     }  
  80.       
  81.     boolean loggin = false;  
  82.       
  83.     String account = null;  
  84.     String ssid = null;  
  85.       
  86.     // 获取Cookie中的account与ssid  
  87.     if(request.getCookies() != null){  
  88.         for(Cookie cookie : request.getCookies()){  
  89.             if(cookie.getName().equals("account"))  
  90.                 account = cookie.getValue();  
  91.             if(cookie.getName().equals("ssid"))  
  92.                 ssid = cookie.getValue();  
  93.         }  
  94.     }  
  95.       
  96.     if(account != null && ssid != null){  
  97.         // 如果加密规则正确, 则视为已经登录  
  98.         loggin = ssid.equals(calcMD5(account + KEY));  
  99.     }  
  100.       
  101. %>  
  102. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  103. <html>  
  104. <head>  
  105. <title><%= loggin ? "欢迎您回来" : "请先登录" %></title>  
  106. <link rel="stylesheet" type="text/css" href="css/style.css">  
  107. </head>  
  108. <body>  
  109. <div align="center" style="margin:10px; ">  
  110.     <fieldset>  
  111.         <legend>当前有效的 Cookie</legend>  
  112.         <script>document.write(document.cookie);</script>  
  113.     </fieldset>  
  114.     <fieldset>  
  115.         <legend><%= loggin ? "欢迎您回来" : "请先登录" %></legend>  
  116.         <% if(loggin){ %>  
  117.             欢迎您, ${ cookie.account.value }.      
  118.             <a href="${ pageContext.request.requestURI }?action=logout">注销</a>  
  119.         <% } else { %>  
  120.         <form action="${ pageContext.request.requestURI }?action=login" method="post">  
  121.             <table>  
  122.                 <tr>  
  123.                     <td>  
  124.                         帐号:  
  125.                     </td>  
  126.                     <td>  
  127.                         <input type="text" name="account" style="width:200px; ">  
  128.                     </td>  
  129.                 </tr>  
  130.                 <tr>  
  131.                     <td>  
  132.                         密码:  
  133.                     </td>  
  134.                     <td>  
  135.                         <input type="password" name="password" style="width:200px; ">  
  136.                     </td>  
  137.                 </tr>  
  138.                 <tr>  
  139.                     <td>  
  140.                         有效期:  
  141.                     </td>  
  142.                     <td>  
  143.                         <input type="radio" name="timeout" value="-1" checked> 关闭浏览器即失效 <br/>  
  144.                         <input type="radio" name="timeout" value="<%= 30 * 24 * 60 * 60 %>"30天内有效 <br/>  
  145.                         <input type="radio" name="timeout" value="<%= Integer.MAX_VALUE %>"> 永久有效 <br/>  
  146.                     </td>  
  147.                 </tr>  
  148.                 <tr>  
  149.                     <td>  
  150.                     </td>  
  151.                     <td>  
  152.                         <input type="submit" value=" 登  录 " class="button">  
  153.                     </td>  
  154.                 </tr>  
  155.             </table>  
  156.         </form>  
  157.         <% } %>  
  158.     </fieldset>  
  159. </div>  
  160.   
  161. </body>  
  162. </html>  


2)使用Servlet实现较为麻烦,MD5的公共方法等略。如下:

A、LoginCookieServlet: 负责记录Cookie的servlet。Post提交表单后,servlet把写两个cookie到客户端。一是账户的cookie,另一个是账户加密后的cookie。然后重定向到CheckCookieServlet,校验。一定要用重定向,确保客户端使用两次请求。由于加密的key是服务器独有的,是安全的。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package servlet.cookie;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.Cookie;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.apache.log4j.Logger;  
  12.   
  13. import util.MD5Utils;  
  14.   
  15. /** 
  16.  *  
  17.  * LoginCookieServlet.java 
  18.  *  
  19.  * @title 永久登录 登录的servlet 
  20.  * @description 
  21.  * @author SAM-SHO 
  22.  * @Date 2014-10-10 
  23.  */  
  24. public class LoginCookieServlet extends HttpServlet {  
  25.   
  26.     private static final long serialVersionUID = 1L;  
  27.     private Logger logger = Logger.getLogger(this.getClass());  
  28.     // 密钥  
  29.     private static final String KEY = ":sam-sho@sinosoft.com";//可以放配置文件  
  30.   
  31.   
  32.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  33.         this.doPost(request, response);  
  34.     }  
  35.   
  36.     /** 
  37.      * post方法访问,处理永久登录 
  38.      */  
  39.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  40.         request.setCharacterEncoding("UTF-8");  
  41.         response.setCharacterEncoding("UTF-8");  
  42.   
  43.         String action = request.getParameter("action");  
  44.   
  45.         if ("login".equals(action)) {  
  46.   
  47.             String account = request.getParameter("account");  
  48.             // String password = request.getParameter("password");  
  49.             int timeout = new Integer(request.getParameter("timeout"));  
  50.   
  51.             // 把帐号连同密钥使用MD5后加密后保存  
  52.             String ssid = MD5Utils.calcMD5(account + KEY);  
  53.   
  54.             // 把帐号保存到Cookie中 并控制有效期  
  55.             Cookie accountCookie = new Cookie("account", account);//中文需要编码  
  56.             accountCookie.setMaxAge(timeout);  
  57.   
  58.             // 把加密结果保存到Cookie中 并控制有效期  
  59.             Cookie ssidCookie = new Cookie("ssid", ssid);  
  60.             ssidCookie.setMaxAge(timeout);  
  61.   
  62.             response.addCookie(accountCookie);// 账户Cookie  
  63.             response.addCookie(ssidCookie);// 加密后账户的Cookie  
  64.               
  65.             logger.debug(accountCookie.getName()+"++++++++"+accountCookie.getValue());  
  66.             logger.debug(ssidCookie.getName()+"+++++++"+ ssidCookie.getValue());  
  67.   
  68.             // 重定向到校验servlet  
  69.             // 使用两个request,这样访问到校验的request就带有了本次response写入的cookie。  
  70.             response.sendRedirect(this.getServletContext().getContextPath() + "/servlet/CheckCookieServlet");  
  71.             return;  
  72.         }   
  73.           
  74.   
  75.     }  
  76.   
  77. }  


B、LoginoutCookieServlet:注销的servlet,负责删除cookie。然后校验。其实可以和LoginCookieServlet进行合并。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package servlet.cookie;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.Cookie;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. /** 
  12.  *  
  13.  * LoginoutCookieServlet 
  14.  *  
  15.  * @title 永久登录-注销的servlet 
  16.  * @description 
  17.  * @author SAM-SHO 
  18.  * @Date 2014-10-10 
  19.  */  
  20. public class LoginoutCookieServlet extends HttpServlet {  
  21.   
  22.     private static final long serialVersionUID = 1L;  
  23.   
  24.       
  25.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         this.doPost(request, response);  
  27.   
  28.           
  29.     }  
  30.   
  31.     /** 
  32.      * post方法访问,处理注销,删除Cookie 
  33.      */  
  34.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  35.         request.setCharacterEncoding("UTF-8");  
  36.         response.setCharacterEncoding("UTF-8");  
  37.   
  38.         String action = request.getParameter("action");  
  39.   
  40.         if ("logout".equals(action)) {  
  41.   
  42.             // 删除Cookie中的帐号  
  43.             Cookie accountCookie = new Cookie("account""");  
  44.             accountCookie.setMaxAge(0);  
  45.   
  46.             // 删除Cookie中的加密结果  
  47.             Cookie ssidCookie = new Cookie("ssid""");  
  48.             ssidCookie.setMaxAge(0);  
  49.   
  50.             response.addCookie(accountCookie);  
  51.             response.addCookie(ssidCookie);  
  52.               
  53.             // 重定向到校验servlet  
  54.             response.sendRedirect(this.getServletContext().getContextPath() + "/servlet/CheckCookieServlet");  
  55.             return;  
  56.         }  
  57.   
  58.     }  
  59.   
  60. }  


C、CheckCookieServlet:负责校验。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package servlet.cookie;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Arrays;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.Cookie;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.log4j.Logger;  
  13.   
  14. import util.MD5Utils;  
  15. /** 
  16.  *  
  17.  * CheckCookieServlet.java 
  18.  * 
  19.  * @title 用于校验 
  20.  * @description 
  21.  * @author SAM-SHO  
  22.  * @Date 2014-10-11 
  23.  */  
  24. public class CheckCookieServlet extends HttpServlet {  
  25.   
  26.     private static final long serialVersionUID = 1L;  
  27.     private Logger logger = Logger.getLogger(this.getClass());  
  28.     // 密钥  
  29.     private static final String KEY = ":sam-sho@sinosoft.com";//可以放配置文件  
  30.   
  31.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  32.         this.doPost(request, response);  
  33.     }  
  34.   
  35.     /** 
  36.      * 校验 
  37.      */  
  38.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  39.           
  40.         request.setCharacterEncoding("UTF-8");  
  41.         response.setCharacterEncoding("UTF-8");  
  42.           
  43.         boolean loggin = false;  
  44.         String account = null;  
  45.         String ssid = null;  
  46.           
  47.         // 获取Cookie中的account与ssid  
  48.         Cookie[] cookies = request.getCookies();  
  49.         if(cookies!= null){  
  50.             logger.debug("所有的Cookies : " + Arrays.asList(cookies));  
  51.               
  52.             for(Cookie cookie : cookies){  
  53.                 if((cookie.getName()).equals("account"))  
  54.                     account = cookie.getValue();  
  55.                 if((cookie.getName()).equals("ssid"))  
  56.                     ssid = cookie.getValue();  
  57.             }  
  58.         }  
  59.           
  60.         if(account != null && ssid != null){  
  61.             // 如果加密规则正确, 则视为已经登录  
  62.             loggin = ssid.equals(MD5Utils.calcMD5(account + KEY));  
  63.         }  
  64.           
  65.         logger.debug("是否匹配  :   "+ loggin);  
  66.         request.getSession(true).setAttribute("loggin", loggin);  
  67.           
  68.         // 跳转到页面  
  69.         request.getRequestDispatcher("/view/cookie/jsp/loginCookie.jsp").forward(request, response);  
  70. //      response.sendRedirect(this.getServletContext().getContextPath() +"/view/cookie/jsp/loginCookie.jsp");  
  71.         return;  
  72.     }  
  73.   
  74. }  


D、loginCookie.jsp:显示页面。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" pageEncoding="UTF-8" isErrorPage="false"%>  
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  3. <c:set var="base" value="${pageContext.request.contextPath}" />  
  4.   
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  6.   
  7.   
  8.   
  9. <html>  
  10.     <head>  
  11.         <title>  
  12.             <c:choose>  
  13.                 <c:when test="${loggin==true}">欢迎您回来</c:when>  
  14.                 <c:otherwise>请先登录</c:otherwise>  
  15.             </c:choose>  
  16.         </title>  
  17.           
  18.         <link rel="stylesheet" type="text/css" href="${base}/css/style.css">  
  19.         <script type="text/javascript" src="${base}/js/jquery-1.7.2.js"></script>  
  20.         <script type="text/javascript" src="${base}/view/cookie/js/cookie.js"></script>  
  21.     </head>  
  22.     <body>  
  23.         <div align="center" style="margin: 10px;">  
  24.             <fieldset>  
  25.                 <legend>  
  26.                     当前有效的 Cookie  
  27.                 </legend>  
  28.                 <script>  
  29.     document.write(document.cookie);  
  30. </script>  
  31.             </fieldset>  
  32.             <fieldset>  
  33.                 <legend>  
  34.                     <c:choose>  
  35.                         <c:when test="${loggin ==true}">  
  36.                     欢迎您回来  
  37.                     </c:when>  
  38.                         <c:otherwise>  
  39.                     请先登录  
  40.                     </c:otherwise>  
  41.                     </c:choose>  
  42.                 </legend>  
  43.                 <c:choose>  
  44.                     <c:when test="${loggin==true}">  
  45.                         欢迎您, ${cookie.account.value }     
  46.                         <a href="${base}/servlet/LoginoutCookieServlet?action=logout">注 销</a>  
  47.                     </c:when>  
  48.                     <c:otherwise>  
  49.                         <form action="${base}/servlet/LoginCookieServlet?action=login"  
  50.                             method="post">  
  51.                             <table>  
  52.                                 <tr>  
  53.                                     <td>  
  54.                                         帐号:  
  55.                                     </td>  
  56.                                     <td>  
  57.                                         <input type="text" name="account" style="width: 200px;">  
  58.                                     </td>  
  59.                                 </tr>  
  60.                                 <tr>  
  61.                                     <td>  
  62.                                         密码:  
  63.                                     </td>  
  64.                                     <td>  
  65.                                         <input type="password" name="password" style="width: 200px;">  
  66.                                     </td>  
  67.                                 </tr>  
  68.                                 <tr>  
  69.                                     <td>  
  70.                                         有效期:  
  71.                                     </td>  
  72.                                     <td>  
  73.                                         <input type="radio" name="timeout" value="-1" checked>  
  74.                                         关闭浏览器即失效  
  75.                                         <br />  
  76.                                         <input type="radio" name="timeout"  
  77.                                             value="<%=30 * 24 * 60 * 60%>">  
  78.                                         30天内有效  
  79.                                         <br />  
  80.                                         <input type="radio" name="timeout"  
  81.                                             value="<%=Integer.MAX_VALUE%>">  
  82.                                         永久有效  
  83.                                         <br />  
  84.                                     </td>  
  85.                                 </tr>  
  86.                                 <tr>  
  87.                                     <td>  
  88.                                     </td>  
  89.                                     <td>  
  90.                                         <input type="submit" value=" 登  录 " class="button">  
  91.                                     </td>  
  92.                                 </tr>  
  93.                             </table>  
  94.                         </form>  
  95.                     </c:otherwise>  
  96.                 </c:choose>  
  97.             </fieldset>  
  98.         </div>  
  99.   
  100.     </body>  
  101.     <script type="text/javascript">  
  102.         var account = CookieJs.getCookie("account");  
  103.         var ssid = CookieJs.getCookie("ssid");  
  104.         alert(account);  
  105.         alert(ssid);  
  106.       
  107.     </script>  
  108. </html>  


2、实例2: 使用Cookie统计UV量。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 客户标识  
  2. private final String CUSTOMER_IDENTIFICATION = "CusID";  
  3. private String uvFlag;  
  4.   
  5.   
  6. /** 
  7.  * cookie中获取用户唯一标识 采用uuid记录 存在获取不存在重新设置 
  8.  */  
  9. private void autoSetCookie() {  
  10.     Cookie[] cookies = getRequest().getCookies();  
  11.     int count = 0;  
  12.     if (cookies != null) {  
  13.         for (Cookie cookie : cookies) {  
  14.             if (org.apache.commons.lang3.StringUtils.equals(  
  15.                     cookie.getName(), CUSTOMER_IDENTIFICATION)) {  
  16.                 uvFlag = cookie.getValue();//存入数据库,以便统计  
  17.                 break;  
  18.             }  
  19.             count++;  
  20.             // 该cookie在cookie列表中不存在  
  21.             if (count == cookies.length) {  
  22.                 autoSetCid();  
  23.             }  
  24.         }  
  25.     } else {  
  26.         autoSetCid();  
  27.     }  
  28. }  
  29.   
  30.   
  31. /** 
  32.  * 自动设置客户端唯一标识 
  33.  */  
  34. private void autoSetCid() {  
  35.     uvFlag = UUID.randomUUID().toString().replaceAll("[-]""");  
  36.     Cookie cidCookie = new Cookie(CUSTOMER_IDENTIFICATION, uvFlag);  
  37.     cidCookie.setDomain(PropertyFileUtil.get("domain"));//写在配置文件  
  38.     cidCookie.setMaxAge(365 * 24 * 60 * 60);  
  39.     cidCookie.setPath("/");  
  40.     getResponse().addCookie(cidCookie);//向客户端写Cookie  
  41. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值