背景知识:
- 我们都知道http是无状态的,因此我们无法通过http来标识用户,而有些信息或者资源只能给特定的用户看,例如用户的信息等等,这时候就出现了会话技术。
- 会话:一个会话包含多个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个。
今天的分享就到这里啦。