Cookie 的运用

Cookie的原理是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端。--- 底层(SUN公司已经给我们提供了一套API)

Cookie是将需要保存的数据保存在了客户端, 是客户端技术. 每个客户端各自保存各自的数据, 再次访问服务器时会带着自己的数据, 每个客户端持有自己的数据, 因此就不会发生混乱了。

~~ 客户端可以存放300个左右Cookie,每个站点最多存放20个Cookie,每个Cookie的大小不能超出4KB ~~

创建Cookie:

 1 //在http请求(iso8859-1)中没有中文存在,则在输入中文用户名时再添加到cookie中,会出现编码问题。
 2 //在没有编码之前服务器将会以iso8859-1的码表来解析username数据。则需要对存入cookie的数据进行URL编码;
 3             
 4 //将用户名保存在Cookie中
 5 Cookie cookie = new Cookie("username", URLEncoder.encode(username, "utf-8"));
 6 //设为保存7天
 7 cookie.setMaxAge(3600*24*7);
 8 //设置站点携带cookie的路径path---将设置成站点的所有页面都会携带cookie值访问后台
 9 cookie.setPath(request.getContextPath()+"/");
10 //发送cookie
11 response.addCookie(cookie);

在JSP中获取指定的Cookie:

 1 <%
 2 /** 获取后台发来的cookie值 **/
 3 Cookie[] coo = request.getCookies();
 4 String username ="";
 5 if(coo != null){
 6     for(Cookie cs:coo){
 7         if("username".equals(cs.getName())){
 8             username = cs.getValue();
 9             /*取出数据时需要对数据进行解码。* **/
10             username = URLDecoder.decode(username, "utf-8");
11         }else{
12             username ="";
13         }
14     }
15 }
16 
17 
18 %>
通过el表达式可直接在JSP页面获取username的值:${ cookie.username.value }
但是需要通过JS来解决解码乱码问题:
  //在记住密码后再次登录解决乱码问题
    var $username = $("input[name='username']");
    //默认只能用utf-8来解码
    var deuser = decodeURI($username.val());  
    //将解码后的数据回写到输入框内
    $username.val(deuser);

删除Cookie:

  ~~现在还没有这=直接删除Cookie的方法。 只能创建一个跟要删除的那个Cookie的名称、path、domain(基本不考虑使用)一致的Cookie来取代或覆盖那个要删除的Cookie,并将新创建的Cookie的 setMaxAge(0)

  ~~需要注意的是 名称、path、domain(基本不考虑使用)一定要一致,不然就会当成是从重新创建了个新的Cookie;

//将cookie清除掉
Cookie cookie = new Cookie("username", "");

cookie.setMaxAge(0);

cookie.setPath(request.getContextPath()+"/");

response.addCookie(cookie);

总结:客户端每次访问服务器端都会携带Cookie到服务器端,服务器端通过request对象来遍历获取指定的Cookie并对其进行处理。

    在addCookie执行之后服务器将对发送的数据用iso8859-1的码表来对其进行编码。则需要在发送Cookie之前就要对数据进行URL编码操作(URLEncoder.encode(String name,String enc))。

    然而在获取Cookie的值时也需要对其进行URL解码(URLDecoder.decode(String name,String enc))。

    当然,在这个过程中,URL的编码和解码一定是相同的码表,不然就会乱码。

原文地址:https://www.cnblogs.com/tongxuping/p/6912449.html