Cookie保存中文
- 上面我们的例子保存的是英文字符,下面我们来看下保存中文字符会怎么样。
response.setContentType("text/html;charset=UTF-8"); PrintWriter printWriter = response.getWriter(); String name = "中国"; Cookie cookie = new Cookie("country", name); cookie.setMaxAge(2000); response.addCookie(cookie); printWriter.write("我颁发了一个Cookie,值保存的是中文数据");
访问Servlet1,好吧。出异常了!
- 中文属于Unicode字符,英文数据ASCII字符,中文占4个字符或者3个字符,英文占2个字符。
- 解决:Cookie使用Unicode字符时需要对Unicode字符进行编码。
//对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
再次访问Servlet1,已经把Cookie成功颁发给浏览器了
我们发现Cookie保存在硬盘的中文数据是经过编码的,那么我们在取出Cookie的时候要对中文数据进行解码
Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { String name = cookies[i].getName(); //经过URLEncoding就要URLDecoding String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8"); printWriter.write(name + "------" + value); }
取出存进Cookie的值
Cookie的有效期
Cookie的有效期是通过setMaxAge()来设置的。
- 如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】
- 如果MaxAge为负数,**Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。这也就为什么在我第一个例子中,如果我没设置Cookie的有效期,在硬盘中就找不到对应的文件。
- 如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie
Cookie的修改和删除
- 上面我们已经知道了Cookie机制没有提供删除Cookie的方法。其实细心点我们可以发现,Cookie机制也没有提供修改Cookie的方法。那么我们怎么修改Cookie的值呢?
- Cookie存储的方式类似于Map集合,如下图所示
- Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。
- 以country为名保存的是%E4%B8%AD%E5%9B%BD,下面我再以country为名,把值改变一下。
String name = "看完博客就点赞"; //对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
现在我要删除该Cookie,把MaxAge设置为0,并添加到浏览器中即可
String name = "看完博客就点赞"; //对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8")); //一定不要忘记添加到浏览器中 cookie.setMaxAge(0); response.addCookie(cookie); printWriter.write("我删除了该Cookie");
访问Servlet,在硬盘已经找不到Cookie的文件了!
注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!