一般地写cookie:
Cookie cookie = new Cookie(cookiename, cookievalue);
cookie.setPath("/");//设置根路径
cookie.setDomain(".caiya.me");//设置访问域,主域和子域可以共享cookie或者设置跨域cookie
cookie.setMaxAge(7 * 24 * 3600);//不设置maxAge那么关闭浏览器cookie失效,此时cookie以会话的形式存在
response.addCookie(cookie);
注:删除cookie将maxAge设置为0,同时要指定path和domain(如果不是默认的话,默认的path为写cookie的路径及子路径,默认的domain为域名全称),修改也类似,没有明确的修改和删除,实质是覆盖和超时失效。
cookie.setPath("/");
cookie.setDomain(".caiya.me");
cookie.setMaxAge(0);
读cookie:
public static String getCookieByName(HttpServletRequest request, String cookieName){
Cookie[] cookies = request.getCookies();
if(null == cookies || cookies.length == 0)
return null;
for(Cookie cookie : cookies){
if(cookieName.equals(cookie.getName())){
return cookie.getValue();
}
}
return null;
}
当然,可以把cookie封装成一个cookieMap使用更方便:
// 封装cookieMap
public static Map convertCookieToMap(Cookie[] cookies){
Map cookieMap = new HashMap();
if(cookies != null && cookies.length != 0){
for (Cookie cookie : cookies) {
cookieMap.put(cookie.getName(), cookie);
}
}
return cookieMap;
}
有点头疼的是,获取cookie的时候如果根域和全域都设置了一个键值对,得不到domain信息;可以先把不需要的那个domain下的cookie删除即可。
通过http header写cookie,并设置安全性:设置httpOnly,js不可读,防止XSS攻击;设置secure,只允许https协议访问
response.setHeader("Set-Cookie", "cookie_name=cookie_value;Path=/;Domain=domain_name;Max-Age=seconds;HTTPOnly;Secure");