为什么要有cookie
浏览器和客户端之间通信,少不了HTTP,但是HTTP是无协议的,服务器不知道上一次浏览器做了些什么操作,于是诞生了cookie
什么是cookie
cookie是一个存储在浏览器的文本文件,存储着用户信息,cookie也称为浏览器会话技术。
每个请求添加Cookie HTTP请求头发送回服务器
组成
Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成.
- Name/Value:设置Cookie的名称及相对应的值。
- Expires属性:设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效
- Path属性:定义了Web站点上可以访问该Cookie的目录
- Domain属性:指定了可以访问该 Cookie 的 Web 站点或域,Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。
- Secure属性:指定是否使用HTTPS安全协议发送Cookie
- HTTPOnly 属性:如果为true,那么通过js脚本将无法读取到cookie信息。
cookie机制
- 用户第一次访问访问网站时,发出一个http请求
- 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部
- 浏览器保持cookie,第二次请求Http请求中会包含一个Cookie的头部
- 服务器响应,返回数据
添加cookie
/**
* 设置cookie
*
* @param response
* @param name cookie名字
* @param value cookie值
* @param maxAge cookie生命周期 以秒为单位
*/
public static void addCookie(HttpServletResponse response,String domain,String path, String name,
String value, int maxAge,boolean httpOnly) {
Cookie cookie = new Cookie(name, value);
cookie.setDomain(domain);
cookie.setPath(path);
cookie.setMaxAge(maxAge);
cookie.setHttpOnly(httpOnly);
response.addCookie(cookie);
}
获取cookie
/**
* 根据cookie名称读取cookie
* @param request
* @param cookieName1,cookieName2
* @return map<cookieName,cookieValue>
*/
public static Map<String,String> readCookie(HttpServletRequest request,String ... cookieNames) {
Map<String,String> cookieMap = new HashMap<String,String>();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
for(int i=0;i<cookieNames.length;i++){
if(cookieNames[i].equals(cookieName)){
cookieMap.put(cookieName,cookieValue);
}
}
}
}
return cookieMap;
}
删除cookie
if (null != cookie) {
cookie.setMaxAge(0);
}