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的编码和解码一定是相同的码表,不然就会乱码。