Cookie
1、Cookie的工作原理
(1)Cookie是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端,是客户端的技术.
(2)客户端向服务器发送请求,服务器获取需要保存的数据,并将需要保存的数据通过Set-Cookie响应头发送给浏览器,浏览器会以Cookie的形式保存在浏览器的内部.
(3)当客户端再次发送请求访问服务器,服务器可以通过Cookie请求头获取上次发送给浏览器的Cookie信息,通过这种方式可以保存会话中产生的数据.
(4)由于Cookie技术是将会话中产生的数据保存在客户端,每个客户端各自持有自己的数据,当需要时再带给服务器,因此不会发生混乱!
2、Cookie的API(操作)
SUN为了简化Cookie的操作, 专门提供了一套Cookie的API:
1、创建Cookie对象
Cookie cookie = new Cookie(String name, String value);
2、将Cookie添加到响应(Response)中
response.addCookie(Cookie c); //可以多次调用此方法添加一个以上的cookie信息
3、获取请求的cookie
request.getCookies(); //获取请求中所有的cookie对象组成的数组, 如果请求中没有任何Cookie, 将会返回null
4、常用方法:
(1) getName() – 获取Cookie的名字
(2) getValue() – 获取Cookie的值
(3) setValue() – 设置Cookie的值(修改)
(4) setMaxAge() – 设置最大存活时间
(5) setPath() – 设置Cookie的path路径
5、setMaxAge方法 – 设置cookie的最大存活时间.
(1)如果不设置该方法, cookie默认是会话级别的cookie, 是保存在浏览器的内存中, 随着浏览器的关闭, 内存的释放, cookie也会销毁!
(2)如果设置了该方法(有效值), cookie将会以文件的形式保存在浏览器的临时文件夹中.即使浏览器关闭, 内存释放, 硬盘上的cookie文件不会丢失, 下次打开浏览器, cookie仍然可以获取到!
6、setPath方法 – 设置浏览器在访问哪一个路径及其子孙路径时将会带着cookie
比如: 发送cookie的Servlet为:
http://localhost/day16/CookieDemo2:
此时cookie的默认path就是: /day16/
浏览器在访问/day16/这个路径或者其子孙路径时将会带着cookie(也就意味着在访问day16任何一个资源时都可以带着Cookie).
如果cookie的path默认不是 当前Web应用的虚拟路径(不是/day16/), 最好能够设置为当前Web应用的虚拟路径, 因为这样可以保证在访问当前应用下任何一个资源时都可以带着Cookie
7、删除cookie
SUN公司提供的Cookie的API中没有提供直接删除cookie的方法
3、Cookie中存储中文时的编码问题
在cookie中保存(值)中文时, 就会出现异常:
解决方式为: 在保存中文数据时, 对中文数据先进行URL编码:
在通过request对象取出cookie中的value时, 需要对编码后的数据进行URL解码:
4、案例: 在网页中显示上次访问时间
1、使用传统方式实现:
//0.处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//1.记录本次访问时间
String dateStr = new Date().toLocaleString();
//2.将本次访问时间(以Cookie的形式)发送给浏览器保存
response.setHeader("Set-Cookie", "time="+dateStr);
//3.获取上次访问时间
String dateStr2 = request.getHeader("Cookie");
//4.做出响应
if( dateStr2 == null ){
//>>如果是第一次, 则响应第一次访问本网站
response.getWriter().write("您是第一次访问本网站!");
}else{
//>>如果不是第一次, 就响应上次访问时间
response.getWriter().write(
"您上次访问的时间为: "+dateStr2);
}
2、使用Cookie的API方式实现:
//设置响应编码
response.setContentType("text/html;charset=utf-8");
//1.获取本次访问的时间
String dateStr1 = new Date().toLocaleString();
//2.将本次访问的时间通过cookie发送给浏览器保存
Cookie cookie = new Cookie("time",dateStr1);
//设置cookie最大存货时间
cookie.setMaxAge(60*60*24*30);
//设置cookie的path为当前Web莹莹的虚拟路径
cookie.setPath(request.getContextPath()+"/");
//把cookie设置到响response,发给浏览器保存
response.addCookie(cookie);
//3.获取上次访问时间
Cookie[] cs = request.getCookies();
String dateStr2 = null;
if(cs != null){
for (Cookie c : cs) {
if("time".equals(c.getName())){
dateStr2 = c.getValue();
}
}
}
//4.将上次访问的时间发送给浏览器显示在网页中
if(dateStr2 == null){
response.getWriter().write("你是第一次访问该网站");
} else{
response.getWriter().write("你上次访问该网站的时间: "+dateStr2);
}