Cookie学习笔记以及案例

前言:

我们平时登陆网页,如果有浏览记录的话,可以不用输入账号账户密码,直接登陆。有没有想过这个原理?

其实就是 浏览器第一次浏览服务器后,服务器会返回给浏览器一个饼干
象征标识浏览器,下次再当浏览器拿着饼干再次浏览该服务器时,  
服务器就认识这个浏览器了 无需认证,直接登陆。

总结:会话数据保存在浏览器客户端,即Cookie中
但是注意:

Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie 
但是浏览器一般只允许存放300个Cookie,  
每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
1)构造Cookie对象
Cookie(String name,String value)
2)设置cookie                 //默认当前项目
void setPath(String uri)   :设置cookie的有效访问路径
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(String newValue) :设置cookie的值
3)发送cookie到浏览器端保存
void response.addCookie(Cookie cookie)  : 发送cookie
4)服务器接收cookie
Cookie[] request.getCookies()  : 接收cookie

流程:

1)服务器创建cookie对象,把会话数据存储到cookie对象中。

2) 服务器发送cookie信息到浏览器
举例: set-cookie: name=eric (隐藏发送了一个set-cookie名称的响应头)

3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

4)浏览器在下次访问服务器时,会带着cookie信息
举例: cookie: name=eric (隐藏带着一个叫cookie名称的请求头)

5)服务器接收到浏览器带来的cookie信息
request.getCookies();

举例:

    Cookie cookie1=new Cookie("name", "1");
        cookie1.setMaxAge(4);    // 数值表示保存的时间 标识4秒内如果浏览器没有再次访问服务器,那么就删除Cookie
        //cookie1.setMaxAge(-1);   //负数就行随意  默认是浏览器关闭后就清除  
        //cookie1.setMaxAge(0);      //删除同名的cookie数据这里是cookie1
        Cookie cookie2=new Cookie("name", "2");  //同名了  
        Cookie cookie3=new Cookie("name", "3");
        //cookie1.setPath("/saa/xx");  //设置Cookie有效路径,一般都是默认项目
        //cookie3.setPath("/day12");
        response.addCookie(cookie1);

        response.addCookie(cookie3); 
        response.addCookie(cookie2);             //响应头是三个都发过去,但是实际上浏览器存储的是最后一个name
        Cookie[] cookies=request.getCookies();
        if(cookies!=null)                        //浏览器存储着Cookie
        {   
            for(Cookie cookiex:cookies) {
                String name=cookiex.getName();
                String value=cookiex.getValue();
                System.out.println(name+"  "+value);
            }
        }else {
            System.out.println("No");
        }

这里写图片描述

有人会问如何查看Cookie呢?

这里写图片描述
url框的最左边位置感叹号可以点,然后
这里写图片描述
即可查看 还可以删除

案例:保存最近一次访问的时间,显示这一次访问的时间:

response.setContentType("text/html;charset=utf-8");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String time=format.format(new Date());
        System.out.println(time);
        Cookie[] cookies=request.getCookies();
        if(cookies!=null) {
            for(Cookie cookieone:cookies) {
                if("lastTime".equals(cookieone.getName())) {
                    String lastTime=cookieone.getValue();
                    cookieone.setValue(time);
                    cookieone.setMaxAge(1*30*24*60*60);
                    response.addCookie(cookieone);
                    response.getWriter().write("上一次访问时间是:"+lastTime+"这一次访问时间是"+time);
                }
            }
        }else {
            System.out.println("第一次访问");
            Cookie cookie=new Cookie("lastTime", time);
            cookie.setMaxAge(1*30*24*60*60);//保存一个月
            response.addCookie(cookie);
            response.getWriter().write(time);
        }

但是会报错:
An invalid character [32] was present in the Cookie value

原因:
一个不识别的字符[32]出现在了cookie当中
由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中32对应的就是空格。

解决方案
只要把后台代码中的空格删掉就可以了。
即删掉 “yyyy-MM-dd hh:mm:ss” 空格 或者改为”-“

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值