Cookie是客户端记录的数据,Session是服务器端记录的数据,用来跟踪整个服务器与客户的会话。
Cookie的主要属性:String name,cookie名;Object value,cookie值;int maxAge,cookie的有效期。
maxAge:正值表示多久后失效,负值表示关闭窗口即失效,0 表示删除。
//MAX_VALUE是2的31次方,基本是永久有效
Cookie cookie = new Cookie("username","cyj");
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie); // 输出到客户端
//相当于删除
Cookie cookie = new Cookie("username","cyj"); // 新建Cookie
cookie.setMaxAge(0);
response.addCookie(cookie); // 必须执行这一句
response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
注意:浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。
Session的主要方法:
void setAttribute(String attribute, Object value):设置Session属性,value参数可以为任何Java Object;
String getAttribute(String attribute):返回session属性;
removeAttribute(String attribute):移除Session属性;
String getId():返回Session的ID,该ID由服务器自动创建,不会重复;
int getMaxInactiveInterval():返回Session的超时时间,单位为秒,超过该时间没有访问,服务器认为该Session失效;
void setMaxInactiveInterval(int second):设置Session的超时时间;
void invalidate():使该Session失效。
URL地址重写:如果客户端不支持或者禁用Cookie,HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,服务器能够解析重写后的URL获取Session的id,依然跟踪会话。
<td>
<a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">
Homepage</a>
</td>
//重写后输出为
<td>
<a href="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=1&wd=Java">Homepage</a>
</td>
//如果是页面重定向(Redirection)
if(“administrator”.equals(userName)) {
response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));
return;
}
Cookie与Session区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上;
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用cookie;
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K。