Cookie使用细节 (1.cookie存活时间 2.cookie如何存储中文)
1.Cookie存活时间
- 浏览器发送请求给AServlet,AServlet会响应一个存有
usernanme=zs
的Cookie对象给浏览器- 浏览器接收到响应数据将cookie存入到浏览器内存中
- 当浏览器再次发送请求给BServlet,BServlet就可以使用Request对象获取到Cookie数据
- 在发送请求到BServlet之前,如果把浏览器关闭再打开进行访问,BServlet能否获取到Cookie数据?
== 注意:浏览器关闭再打开不是指打开一个新的选项卡,而是必须先关闭应用程序,再打开,顺序不能变==
==针对上面的问题,通过演示会发现,BServlet中无法再无法获取到Cookie数据,这是为啥?
- 默认情况下。Cookie存储在浏览器内存中,当浏览器关闭时,内存释放,则Cookie被销毁。
一定要明白cookie存储在浏览器内存中的,关闭浏览器cookie可能会被销毁。为啥是可能,因为后面我们会将到cookie的存活时间,也就是说我们可以设置cookie的存活时间
如果我们在登录一个网页时选了记住密码我们如何解决Cookie持久化的存储?
cookie其实已经为我们提供好了对应的API来完成这件事,这个API就是setMaxAge - 设置Cookie存活时间
setMaxAge(int seconds);
参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器关闭,则浏览器关闭,则Cookie被销毁
3.零:删除对应的Cookie
接下来,就设置AServlet中去设置Cookie的存活时间。
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1. 创建Cookie对象
Cookie cookie = new Cookie("username","zs");
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7); //易阅读,需程序计算
//cookie.setMaxAge(604800); //不易阅读(可以使用注解弥补),程序少进行一次计算
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
Cookie存储中文
首先,先来演示一个效果,将之前username=zhangsan的值改为username=张三,把汉字张三存入到Cookie中,看是什么效果:
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
String value = "张三";
Cookie cookie = new Cookie("username",value);
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
启动访问测试,访问http://localhost:8080/cookie-demo/aServlet
会发现浏览器会提示错误信息
通过上面的案例演示,我们得到一个结论:
- Cookie不能直接存储中文
Cookie不能存储中文,但是如果有这方面的需求,这个时候如何解决?
这里需要用到我们之前学过的知识点URL编码,如果要存储中文,就需要进行转码,具体的实现思路为:
- 在AServlet中对中文进行URL编码,采用URLEncode.encode(),将编码后的值存入Cookie中
- 在BServlet中获取Cookie中的值,获取的值为URL编码后的值
- 将获取的值在进行URL解码,采用URLDecode.decode(),就可以获取到对应的中文值
(1)在AServlet中对中文进行URL编码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
String value = "张三";
//对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
//将编码后的值存入Cookie中
Cookie cookie = new Cookie("username",value);
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
(2)在BServlet中获取值,并对值进行解码
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1. 获取Cookie数组
Cookie[] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
//URL解码
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name+":"+value);//value解码后为 张三
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
这样我们就可以将中文存入Cookie中进行使用。
小结
Cookie的使用细节中,我们要注意cookie的存活时间和存储中文
- 存活时间,需要掌握setMaxAage() API的使用
- 存储中文,需要掌握URL编码和解码的使用