浅谈Cookie

背景知识:

  1. 我们都知道http是无状态的,因此我们无法通过http来标识用户,而有些信息或者资源只能给特定的用户看,例如用户的信息等等,这时候就出现了会话技术。
  2. 会话:一个会话包含多个http请求,它的作用主要用于这些http请求之间数据的共享。

首先我们来聊聊Cookie。它是一种客户端会话技术(主要指浏览器)。服务器端通过Set-Cookie响应头设置cookie的值,客户端通过Cookie请求头将cookie值传递给服务器端。那么在Servlet中如何设置cookie呢?

设置cookie的值:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Cookie cookie = new Cookie("name", "weixin");
    resp.addCookie(cookie);
    Cookie cookie1 = new Cookie("age", "12");
    resp.addCookie(cookie1);
}

当我们访问上述Servlet时,可以看到如下信息:("option+comand+i" 打开谷歌浏览的调试工具)

那么如何在Servlet中获取我们刚刚设置的值呢?

获取cookie的值
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if(null != cookies) {
            for(Cookie cookie : cookies) {
                System.out.println(cookie.getName());
                System.out.println(cookie.getValue());
            }
        }
}

以上就是cookie简单的操作,接下来我们来说说一些注意点:

1. 默认情况下Cookie是存储在内存中,随着浏览器的关闭而销毁。那么如何让Cookie持久化呢?一般服务端语言都提供相应的API,在java中使用如下方法设置:

设置cookie的有效期:
    cookie.setMaxAge(int seconds);
seconds为正数时,表示持久化的时间
seconds为负数是,即默认值,浏览器关闭后就销毁
seconds为0,表示删除当前cookie

2.根据上面的例子我们可以发现Cookie是可以设置多个的,并且展现形式是返回多个Set-Cookie响应头。然后浏览器携带多个Cookie值就只携带一个Cookie请求头,值之间用分号分割。

3.Cookie只能存储字符串,说起字符串不得不谈谈中文乱码的问题,一般的解决方法就是先进行编码再存储,然后取值的话在使用前进行解码,一般采用url编码,各个服务端语言也都提供相应的API。在java中的实现方法:

设置cookie的值:
    String name = "嘻嘻";
    // 编码
    String encode = URLEncoder.encode(name, "utf-8");
    Cookie cookie = new Cookie("name", encode);
获取cookie的值:
    Cookie[] cookies = req.getCookies();
    if(null != cookies) {
        for(Cookie cookie : cookies) {
            if("name".equals(cookie.getName())){
                String value = cookie.getValue();
                // 解码
                String decode = URLDecoder.decode(value, "utf-8");
            }
        }
    }

4.关于Cookie还有一个需要注意点的就是作用域。在java中默认会给Cookie设置的作用域是当前web应用的虚拟目录下,换句话说其他虚拟目录下面的Servlet是无法访问和使用Cookie值的。

当然我们是可以改变这个Path值的,当然各个服务端语言也会有相应的API,在java中使用如下方法:

// 设置path值为根路径
cookie.setPath("/");

与Path相对应的就是Domain了,这个参数一般在多域名共享cookie的时候会使用到。试想一个场景,例如百度www.baidu.com服务器设置了一个Cookie值,这个Cookie值需要在music.baidu.com服务器和news.baidu.com服务能访问,那么如何实现呢?一个简单地方式就是设置Cookie的Domain值:

// 将cookie设置在一级域名下面,那么二级,三级等等都是可以共享的
cookie.setDomain(".baidu.com");

最后聊聊Cookie的特点:Cookie是一种基于客户端的会话技术,将共享的数据存放在客户端中,这也导致它并不适合存放一些敏感的数据,并且在大小上也是做了限制的,一般单个Cookie不能超过4kb,并且在同一个域名下面Cookie的个数不能超过20个。

今天的分享就到这里啦。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值