参考《servlet和jsp学习指南》
Session管理(或Session追踪)是Web应用程序开发中一个非常重要的主题。这是因为HTTP是无状态的。在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的用户。
本文介绍可以用于保持状态的4 种方法:网址重写(URL rewriting)、隐藏域、cookie及HttpSession对象。
网址重写
网址重写是一种Session追踪技术,需要将一个或多个token作为一个查询字符串添加到一个URL中
token格式为url?key-1=value-1&key-2=value-2
网址重写只适用于那些既需要保持,却又不跨越太多页面,并且又不太重要的信息。
任何相对的URL(没有协议部分的URL)都会被当作是相对于当前页面的URL。
举例:分页中的下一页
如第二页的url为:xxx?pageNum=2&pageSize=10
隐藏域
将值放在HTML表单的隐藏域中。当用户提交表单时,隐藏域中的值也传送到服务器。只有当页面包含表单,或者可以在页面中添加表单时,才适合使用隐藏域。这种技术胜过网址重写技术的地方在于,可以将更多的字符传到服务器,并且不需要进行字符编码。但是像网址重写一样,也只有当要传递的信息不需要跨越多个页面时,才适合使用这种技术。
举例:比如在html页面表单中修改用户相关的内容时,要将用户id放在隐藏域中
cookie
cookie是自动地在Web服务器和浏览器之间来回传递的一小块信息。cookie适用于那些需要跨越许多页面的信息,cookie是作为HTTP标头嵌入的。
cookie的不足之处在于,用户可以通过修改浏览器设置来拒绝接受cookie。
要使用cookie,必须熟悉javax.servlet.http.Cookie类,以及HttpServletRequest和HttpServletResponse接口中的几个方法
当浏览器再次发出对同一个资源或者对同一台服务器中的不同资源的请求时,它会同时把从Web浏览器处收到的cookie再传回去。
cookie也可以利用JavaScript在客户端进行创建和删除
//将一个cookie 发送到浏览器
httpServletResponse .addCookie(cookie);
//访问浏览器发出的cookie
Cookie[) cookies= request.getCookies() ;
Cookie maxRecordsCookie = null ;
if (cookies ! = null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals( "maxRecords” ))
maxRecordsCookie = cookie ;
break;
}
}
}
//删除cookie
//创建一个同名的cookie
Cookie cookie= new Cookie (”userName”,””);
//将maxAge属性设置为0
cookie.setMaxAge(O);
response.addCookie(cookie);
HttpSession对象
在所有的Session追踪技术中,HttpSession对象是最强大的,也是功能最多的。用户可以没有或者有一个HttpSession,并且只能访问自己的HttpSession
HttpSession是当一个用户第一次访问某个网站时自动创建的。通过在HttpServletRequest中调用getSession方法,可以获取用户的HttpSession
与网址重写、隐藏域和cookie不同的地方在于,放在HttpSession中的值是保存在服务器的内存中的。注意,HttpSession中保存的值不发送到客户端,这与其他的Session管理方法不同。Servlet容器为它所创建的每一个HttpSession生成一个唯一标识符,并将这个标识符作为一个token发送给浏览器,一般是作为一个名为JSESSIONID的cookie,或者作为一个jsessionid参数添加到URL后面。在后续的请求中,浏览器会将这个token发送回服务器,使服务器能够知道是哪个用户在发出请求。
HttpSession中还定义了一个invalidate方法。这个方法强制Session过期,并将绑定到它的所有对象都解除绑定。在默认情况下,HttpSession是在用户静默一定时间之后过期。可以在部署描述符的session-timeout元素中将session的期限设置为整个应用程序
添加到HttpSession中的值不一定是String,可以为任意Java 对象,只要它的类实现了java.io.Serializable接口即可,以便当Servlet容器认为有必要的时候,保存的对象可以序列化成一个文件或者保存到数据库中
//将一个值放在HttpSession中
void setAttribute (java.lang.String name, java.lang.Object value)
//获取HttpSession 中保存的对象
java.lang.Object getAttribute(java.lang.String name)
//迭代一个HttpSession 中的所有属性
java.util.Enumeration<java.lang.String> getAttributeNames()
在使用HttpSession对象时要注意:每个对象都会消耗服务器的内存。