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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值