Cookie细节

公众号查看文章格式更清晰

 

Cookie细节

Cookie不可跨域名性

很多人在初学的时候可能有一个疑问:在访问Servlet的时候浏览器是不是把所有的Cookie都带过去给服务器,会不会修改了别的网站的Cookie.

答案是否定的。Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu相关的Cookie带过去,而不会带上google的Cookie。

Cookie保存中文

public class CookieTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置response编码
        resp.setContentType("text/html;charset=UTF-8");
        //创建Cookie对象
        Cookie cookie = new Cookie("username","九月");
        //发送Cookie给浏览器需要设置Cookie的时间
        cookie.setMaxAge(1000);
        //向浏览器发送一个cookie
        resp.addCookie(cookie);
        resp.getWriter().write("向浏览器发送了一个Cookie");
    }

出异常了,HTTP Status 404

 

  • 中文属于Unicode字符,英文数据ASCII字符,中文占4个字符或者3个字节,英文占2个字节。

  • 解决:Cookie使用Unicode字符时需要对Unicode字符进行编码。

Cookie cookie = new Cookie("username", URLEncoder.encode("九月","UTF-8"));

获取Cookie

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie [] cookies = req.getCookies();
        if (cookies!=null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                //经过URLEcoding编码则取出Cookie的时候要对中文数据进行解码
                String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
                resp.getWriter().write(name+": "+value+"
");
            }
        }
}

取出的值:

JSESSIONID: 8F2C4FFEBDE8EE8BB792DA9DDF28BE4F
username: 九月

Cookie的有效期

Cookie的有效期是通过setMaxAge()来设置的

  • 如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】

  • 如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。

  • 如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie

Cookie的修改和删除

Cookie机制也没有提供修改Cookie的方法。那么我们怎么修改Cookie的值呢?Cookie存储的方式类似于Map集合

cookie集合

keyvalue
usernamejiuyue
keyval
~~

Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie,重新赋值即可。

现在我要删除该Cookie,把MaxAge设置为0,并添加到浏览器中即可

cookie.setMaxAge(0);

访问Servlet,已经找不到Cookie!

注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!
我修改下Cookie的其他属性,再删除,不能把Cookie删除掉。

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置response编码
            resp.setContentType("text/html;charset=UTF-8");
            //创建Cookie对象
            Cookie cookie = new Cookie("username", URLEncoder.encode("九月","UTF-8"));
            //发送Cookie给浏览器需要设置Cookie的时间
            //cookie.setMaxAge(1000);
            cookie.setPath("/aaa");
            cookie.setMaxAge(0);
            //向浏览器发送一个cookie
            resp.addCookie(cookie);
            resp.getWriter().write("向浏览器发送了一个Cookie");
        }

Cookie的域名

Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”

Cookie的隐私安全机制决定Cookie是不可跨域名的。也就是说www.baidu.com和www.google.com之间的Cookie是互不交接的。即使是同一级域名,不同二级域名也不能交接,也就是说:www.goole.com和www.image.goole.com的Cookie也不能访问

我在本地上配置了3个虚拟主机:
localhost,
www.jiuyue.com,
www.image.jiuyue.com

我用www.jiuyue.com域名发送了一个Cookie给浏览器

 Cookie cookie = new Cookie("name", "jiuyue");
 cookie.setMaxAge(1000);
 response.addCookie(cookie);
 printWriter.write("使用www.jiuyue.com域名添加了一个Cookie");
  • Cookie不可跨名性,localhost域名拿不到www.jiuyue.com颁发给浏览器的Cookie

  • 使用www.image.jiuyue.com域名访问,证明即使一级域名相同,二级域名不同,也不能获取到Cookie

  • 使用www.jiuyue.com当然能获取到Cookie,Cookie通过请求头带给服务器

设置一级域名相同的网页Cookie之间可以相互访问,也就是说www.image.jiuyue.com可以获取到www.jiuyue.com的Cookie就需要使用到domain方法

Cookie cookie = new Cookie("name", "jiuyue");
cookie.setMaxAge(1000);
cookie.setDomain(".jiuyue.com");
response.addCookie(cookie);
printWriter.write("使用www.jiuyue.com域名添加了一个Cookie,只要一级是jiuyue.com即可访问");

设置cookie.setDomain(".jiuyue.com");使用www.image.jiuyue.com域名访问。发现可以获取到Cookie了。

“扫码关注“

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值