首页 > 代码库 > 第二章_session管理
第二章_session管理
2.1 网址重写
网址重写是一种Session追踪技术,需要将一个或多个token做为一个查询字符串添加到一个URL中。Token的格式一般是键=值。
Url?key-1=value-1&key-2=value-2...&key-n=value-n
2.2 隐藏域
利用隐藏域来保持状态,与采用网址重写技术类似。但它不是将值添加到URL后面,而是将他们放在HTML表单的隐藏域中。当用户提交表单时,隐藏域的值也传送到服务器。只有当页面包含表单,或者可以在页面中添加表单时,才适合使用隐藏域。这种技术胜过网址重写的地方在于,可以将更多的字符传到服务器,并且不需要进行字符编码。但是像网址重写一样,也只有当要传递的信息不需要跨越多个页面时,才适合使用这种技术。常见的隐藏域我们用来显示id,这样方便编辑的时候可以根据id获取到值显示出来。
2.3 Cookie
Cookie是自动在Web服务器和浏览器之间来回传递的一小块信息。Cookie适用于那些需要跨越许多页面的信息。由于cookie是做为HTTP标头嵌入的,因此传输他的过程由HTTP协议处理。除此之外,还可以根据自己的需要设置cookie的有效期限。对于Web浏览器而言,每台Web服务器最多可以支持20额cookie。
Cookie的不足之处在于,用户可以通过修改他的浏览器设置来拒绝接受cookie。
要使用cookie,必须熟悉javax.servlet.http.cookie类,以及HttpServletRequest和HttpServletResponse接口中的几个方法。
要创建一个cookie,传递一个名称和一个值给Cookie类的构造器:
Cookie cookie = new Cookie(name,value) ;
例如,要创建一个选择语言的cookie,可以这么写:
Cookie languageSelectionCookie = new Cookie(“language”,”Italian”) ;
创建cookie之后,可以设置他的domain、path及maxAge属性。尤其值得关注的是maxAge属性,因为它决定cookie的有效期。
httpservletResponse.addCookie(cookie);
当浏览器再次发出对同一个资源或者对同一台服务器中的不通资源的请求时,它会同时把从Web浏览器处收到的cookie再传回去。
要访问浏览器发出的cookie,可以在HttpServletRequest中使用getCookies方法。该方法将返回一个Cookie数组,如果请求中没有cookie,将返回null。为了找到某个名称的cookie,需要迭代数组。下面举个例子,看看如何读取一个名为maxRecords的cookie。
Cookie[] cookies = request.getCookies() ; Cookie maxRecordsCookie = null ; if(cookies != null){ for(Cookie cookie:cookies){ if(cookie.getName().equals("maxRecords")){ maxRecordsCookie = cookie ; break ; } } }
令人遗憾的是,没有getCookieByName方法可以使获取cookie变得更简单一些。更令人难过的是,也没有方法可以直接删除cookie。为了删除cookie,需要创建一个同名的cookie,将它的maxAge属性设置为0,并在HttpServletResponse中添加一个新的cookie。看看下面是如何删除一个名为userName的cookie的:
Cookie cookie = new Cookie(“userName”,””) ;
cookie.setMaxAge(0) ;
response.addCookie(cookie) ;
2.4 HttpSession对象
HttpSession是当一个用户第一次访问某个网站时自动创建的。通过在HttpServletRequest中调用getSession方法,可以获取用户的HttpSession。getSession有两个重载方法:
HttpSession getSession()
HttpSession getSession(boolean create)
无参的getSession方法返回当前的HttpSession,如果当前没有,则创建一个并返回。getSession(false)方法返回当前的HttpSession(若有),如果没有,则返回null。getSession(true)方法返回当前的HttpSession(若有),如果没有,则新建一个并返回。getSession(true)和getSession是一样的。
放在HttpSession中的值是保存在内存中的。
添加到HttpSession中的值不一定是String,可以为任意java对象,只要它的类实现了java.io.Serializable接口即可,以便当Servlet容器认为有必要的时候,保存的对象可以序列化成一个文件或者保存到数据库中,例如,当容器的内存快要用完的时候,仍然可以将非序列化的对象保存在HttpSession中,但是如果Servlet容器试图将他们序列化,将会以失败告终,并抛出异常。
未完待续...