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集合
key | value |
---|---|
username | jiuyue |
key | val |
~ | ~ |
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了。
“扫码关注“