深入理解Session与Cookie
Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的有点,也有各自的缺陷。Cookie会随着个数的增多和访问量的增加,它占用的网络带宽也很大,Session致命缺点在于多台服务器之间的共享。
Cookie
属性项 | 属性项介绍 |
---|---|
NAME-VALUE | 注意这里的NAME不能和其他属性项的名字一样 |
Expires | 过期时间,在设置的某个时间点后该Cookie就会失效 |
Domain | 生成该Cookie的域名 |
Path | 该Cookie是在当前哪个路劲下生成的 |
Secure | 如果设置了这个属性,那只会在SSH连接时才会回传该Cookie |
当前Cookie有两个版本:Version 0 和Version 1,它们有两种设置响应头的标识,分别是“Set-Cookie”和“Set-Cookie2”。这两个版本的属性项有些不同。
Version 0 属性项介绍
属性项 | 属性项介绍 |
---|---|
NAME-VALUE | 注意这里的NAME不能和其他属性项的名字一样 |
Expires | 过期时间,在设置的某个时间点后该Cookie就会失效 |
Domain | 生成该Cookie的域名 |
Path | 该Cookie是在当前哪个路劲下生成的 |
Secure | 如果设置了这个属性,那只会在SSH连接时才会回传该Cookie |
Version 1 与Version 0 中设置的Header头的标识符是不同的,我们常用的是Set-Cookie:userName="";Domain="",这是Version0的形式。针对Set-Cookie2是这样设置的:Set-Cookie2:userName="";Domain="";Max-Age=1000。但是在Java Web的Servlet规范中并不支持Set-Cookie2响应头。
String getCookie(Cookie[] cookies, String key) {
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(key)) {
return cookie.getValue();
}
}
}
return null;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
String userName = getCookie(cookies, "userName");
String userAge = getCookie(cookies, "userAge");
if (userName == null) {
response.addCookie(new Cookie("userName", "zft"));
}
if (userAge == null) {
response.addCookie(new Cookie("userAge", "26"));
}
response.getHeader("Set-Cookie");
}