会话管理

会话管理

主要包含的状态保存技术有:URL重写、隐藏域、cookies和HttpSession对象。

一. URL重写

URL重写是一种会话跟踪技术,它将一个或多个token添加到URL的查询字符串中,每个token通常为key=value形式,如下:

    url?key1=value1&key2=value2

URL重写适合于tokens无须在太多URL间传递的情况下,然而它有如下限制:

  1. URL在某些浏览器上最大长度为2000字符
  2. 若要传递值到下一个资源,需要将值插入到链接中,换句话说,静态页面很难传值
  3. URL重写需要在浏览器上完成,所有的链接都必须带值,因此当一个页面存在很多链接时,处理过程会是一个不小的挑战
  4. 某些字符,例如空格、与和问号等必须用base64编码
  5. 所有的信息都是可见的

因为存在如上限制,URL重写近适于信息存在少量页面间传递,且信息本身不敏感。

二. 隐藏域

使用隐藏域来保持状态类似于URL重写技术,但不是将值赋值到URL上,而是将值放到HTML表单的隐藏域中。当表单提交时,隐藏域的值也同时提交到服务器端。隐藏域技术仅当网页有表单时有效。该技术相对于URL重写的优势在于:没有字符数限制,同时无需额外的编码。但该技术同URL重写一样,不适合跨越多个页面。

三. Cookies

Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此cookies可存储在多个页面间传递的信息。Cookies作为HTTP header的一部分,其传输由HTTP协议控制。此外,可以控制cookies的有效时间。

可以通过传递name和value两个参数给Cookie类的构造函数来创建一个cookies:

Cookie cookie = new Cookie(name, value);

一个创建语言选择的cookie示例:

Cookie languageSelectionCookie = new Cookie("language", "Italian");

创建完一个Cookie对象后,你可以设置domain、path和maxAge属性。其中maxAge属性决定cookie何时过期。
要将cookie发送到浏览器,需要调用HttpServletResponse的add方法:

httpServletResponse.addCookie(cookie);

浏览器在访问同一Web服务器时,会将之前收到的cookie一并发送。
服务器若要读取浏览器提交的cookie,可以通过HttpServletRequest接口的getCookies方法,该方法返回一个Cookie数组,若没有cookie则返回null。你需要遍历整个数组来查询某个特定名称的cookie。如下为查询名为maxRecords的cookie的示例:

Cookie[] cookies = request.getCookies();
Cookie maxRecordsCookie = null;
for(cookies != null){
    for(Cookie cookie:cookies){
        if(cookie.getName().equals("maxRecords")){
            maxRecordsCookie = cookie;
            break;
        }
    }
}

目前,还没有类似于getCookieByName这样的方法来帮助简化工作。此外,也没有一个直接的方法来删除一个cookie,你只能创建一个同名的cookie,并将maxAge属性设置为0,并添加到HttpServletResponse接口中,如下:

Cookie cookie = new Cookie("userName", "");
cookie.setMaxAge(0);
response.addCookie(cookie);

四. HttpSession对象

一个用户可以有且最多只有一个HttpSession,并且不会被其它用户访问到。

HttpSession对象在用户第一次访问网站的时候自动被创建,你可以通过调用HttpServletRequest的getSession方法获取该对象。getSession有两个重载方法:

HttpSession getSession();
HttpSession getSession(boolean create);

可以通过HttpSession的setAttribute方法将值放入HttpSession,该方法签名如下:

void setAttribute(String name, Object value);

请注意,不同于URL重写、隐藏域或cookie,放入到HttpSession的值,是存储在内存中的,因此,不要往HttpSession放入太多对象或大对象。

所有保存在HttpSession的数据不会被发送到客户端,不同于其它会话管理技术,Servlet容器为每个HttpSession生成唯一的标识,并将该标识发送给浏览器,或创建一个名为JSESSIONID的cookie,或者在URL后附加一个名为jessionid的参数。在后续的请求中,浏览器会将标识提交给服务器,这样服务器就可以识别请求是由哪一个用户发起的。Servlet容器会自动选择一种方式传递会话标识,无需开发人员介入。可以通过调用HttpSession的getId方法来读取该标识:

String getId();

此外,HttpSession还定义了一个名为invalidate的方法。该方法强制会话过期,并清空其保存的对象。默认情况下,HttpSession会在用户不活动一段时间后自动过期,该时间可以通过部署描述符的session-timeout元素配置,若设置为30,则会话对象会在用户最后一次访问30分钟后过期,如果部署描述符没有配置,则该值取决于Servlet的设定。

可以通过调用HttpSession的getMaxInactiveInterval方法来查看会话多久会过期。该方法返回一个数字类型,单位为秒。调用setMaxInactiveInterval方法来单独对某个HttpSession设定其超时时间:

void setMaxInactiveInterval(int seconds);

若设置为0,则该HttpSession永不过期。通常这不是一个好的设计,因为该HttpSession所占用的堆内存将永不释放,直到应用重加载或Servlet容器关闭。

五. 小结

URL重写和隐藏域是轻量级的会话跟踪技术,适用于那些仅跨少量页面的数据。而cookie和HttpSession对象,更加灵活但也有限制,尤其是在应用HttpSession时会消耗服务器内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值