【获取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
就是其中两种,还有Expires
和Max-Age
,下面是详细介绍:
1.domain
和path
这两个属性定义了cookie的可使用的范围。从安全角度出发,cookie的可使用范围可以设置为当前资源的顶级域以及它的子域,其他域不能使用,比如example.org
(注意domain
是不包含wwww
的,也不包含/xx
的形式)就不能将domain
设置为foo.com
,这样将会允许example.org
控制foo.com
的Cookie。如果服务端没有特别指定domain
和path
,它们默认为所请求资源的域和路径。对于同一个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
页面,将t1
和t2
都写进入到客户端后,Response headers中就有这两者信息了,然后在访问/user/go
页面时,Requestheaders中就自动将设置了domain
为localhost
的cookiet2
发送过去了(因为http://localhost:8080/user/go
属于localhost
的子域),而没有设置domain
设置了path
的t1
则不会被发送(没有设置domain
默认只在当前请求路径下生效,即也是localhost
,但是它的path
设置的是/cookie
,没有这个路径,只有/user/cookie
这个路径,所以它不会被发送);在实际测试过程中,如果只设置了path
,没有设置domain
,那么所有在设置的path
下的子路径都会收到该cookie,默认domain
就是当前访问的域,如果同时设置了domain
和path
,那么cookie只会发送到同时满足两者条件的URL上。
2.expires
和Max-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.secure
和httpOnly
secure
和httpOnly
属性并没关联的值,secure
表示浏览器只可以通过加密传输来使用cookie,但是,如果Web服务器使用来自非安全连接的安全属性设置cookie,则在通过中间人攻击将cookie发送给用户时,仍然可以截获cookie,所以为了最大限度地提高安全性,只应通过安全连接设置具有Secure属性的cookie。httpOnly
属性表示浏览器不应该通过http/https
以外的通道公开cookie,就表示不能通过客户端脚本语言(特别是JavaScript)访问cookie,因此不能通过跨站点脚本(普遍的攻击技术)轻松窃取。