关于Cookie

【获取Cookie】 获取Cookie时是一个数组,在获取Cookie的过程中有一个工具类提供了一个方法(在用户请求接口时根Cookie的key获取对应的Value,虽然行数较多,但注意整体代码的效率):

public static String getValue(HttpServletRequest request, String key) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        Cookie[] var3 = cookies;
        int var4 = cookies.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            Cookie cookie = var3[var5];
            if (key.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }

        return null;
    } else {
        return null;
    }
}

【清除Cookie】 这里找半天,好像没有找到像remove()或者delete()等直接清除Cookie的方法,这里记录2种方式:一种是直接new一个为null的同名Cookie对象放到response中即可;另一种是先获取到指定名字的Cookie,然后将它的Value置为null,最后塞到response中即可(这一步不能少!!)。在这个案例中,清除Cookie的过程,主要是先取出Cookie中wu_sn_k的值(只有登陆的用户才会有这个Cookie,如没有就直接返回),然后根据wu_sn_k的值作为key去Redis中删对应的用户缓存信息,同时将wu_sn_k置空,最后将它写入客户端,“记住我”(Cookie为wu_rmb_k)的Cookie也是一样的流程,以清除wu_sn_k为例,记录一下代码:

// 这里是直接new一个为null的同名Cookie塞进去
Cookie loginCookie = new Cookie(LOGIN_USER_CK, null);
loginCookie.setDomain(loginDomain);
loginCookie.setPath("/");
loginCookie.setMaxAge(0);
response.addCookie(loginCookie);

结合上面的代码,关于Cookie做一些简单知识点的记录,Cookie除了Key-Value外,还有很多属性,domain(域)和path就是其中两种,还有ExpiresMax-Age,下面是详细介绍:

1.domainpath

 这两个属性定义了cookie的可使用的范围。从安全角度出发,cookie的可使用范围可以设置为当前资源的顶级域以及它的子域,其他域不能使用,比如example.org(注意domain是不包含wwww的,也不包含/xx的形式)就不能将domain设置为foo.com,这样将会允许example.org控制foo.com的Cookie。如果服务端没有特别指定domainpath,它们默认为所请求资源的域和路径。对于同一个foo.com网址,没有设置domain和设置domain,对于大部分的浏览器是存在差异的,设置domain的,cookie仅仅会发送给foo.com,就是所谓的“host-only cookie”,设置了domain的,那么将包括所设domain的所有子域(比如docs.foo.com)。注意上述的总结一下就是设置了domain,那么这个cookie将会被发送到该domain以及它的子域(如sub.example.org就是example.org的子域),没有设置domain的,那这个cookie只会发送到所请求资源domain(不包含它的子域)。最后比较奇葩的是IE浏览器,不管设不设置domain,它都是会将cookie发送到子域。下面是一个例子:

@RequestMapping("/cookie")
public String cookie(HttpServletResponse response) {

    Cookie cookie = new Cookie("t1", "goujianwu");
    cookie.setPath("/cookie");

    Cookie cookie1 = new Cookie("t2", "goujianwu1");
    cookie1.setDomain("localhost");

    response.addCookie(cookie);
    response.addCookie(cookie1);

    return "cookie";
}

结果如下:
这里写图片描述
这里写图片描述

第一次访问/user/cookie页面,将t1t2都写进入到客户端后,Response headers中就有这两者信息了,然后在访问/user/go页面时,Requestheaders中就自动将设置了domainlocalhost的cookiet2发送过去了(因为http://localhost:8080/user/go属于localhost的子域),而没有设置domain设置了patht1则不会被发送(没有设置domain默认只在当前请求路径下生效,即也是localhost,但是它的path设置的是/cookie,没有这个路径,只有/user/cookie这个路径,所以它不会被发送);在实际测试过程中,如果只设置了path,没有设置domain,那么所有在设置的path下的子路径都会收到该cookie,默认domain就是当前访问的域,如果同时设置了domainpath,那么cookie只会发送到同时满足两者条件的URL上。

2.expiresMax-Age

Expires用于指定浏览器于特定时间删除该cookie,特定时间的格式为Wdy, DD Mon YYYY HH:MM:SS GMT或者Wdy, DD Mon YY HH:MM:SS GMT(0

Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
    if (cookies[i].getName().equals("t1")) {
        cookies[i].setMaxAge(10);
        response.addCookie(cookies[i]);
    }
}

3.securehttpOnly

securehttpOnly属性并没关联的值,secure表示浏览器只可以通过加密传输来使用cookie,但是,如果Web服务器使用来自非安全连接的安全属性设置cookie,则在通过中间人攻击将cookie发送给用户时,仍然可以截获cookie,所以为了最大限度地提高安全性,只应通过安全连接设置具有Secure属性的cookie。httpOnly属性表示浏览器不应该通过http/https以外的通道公开cookie,就表示不能通过客户端脚本语言(特别是JavaScript)访问cookie,因此不能通过跨站点脚本(普遍的攻击技术)轻松窃取。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值