[Servlet]会话追踪技术

Session管理

Session管理也即是Session追踪(会话追踪)。因为HTTP是无状态的,所以WEB服务器无法知道HTTP这个请求是否访问过。
对于Session保持状态,有4种方法:

  • URL重写
  • 隐藏域
  • cookie
  • HttpSession对象

URL重写

URL重写是种Session追踪技术,需要将一个或者多个token作为查询字符串添加到一个url中。
token的格式一般为键 = 值:
url?key1=value1&key2=value2&...&keyn=valuen
如果token不经过过多的URL四处携带,那么URL重写就比较合适。有些浏览器设置禁用cookie可以使用。
缺点:

  • Web浏览器对URL限制2000个字符
  • URL重写对于静态页面比较费力
  • URL重写必须在服务器端有效。所有链接必须带值。
  • 某些字符,如&,空格等需要进行转码
  • 添加到URL部分的toke是可见的,所以这些token不能携带重要信息

隐藏域

利用隐藏域来保持状态与URL重写技术类似,但是不会将值添加到URL的后面。而是放在html表单的隐藏域中。这就技术可以提交更多的token。在不需要跨多个页面时,才适合使用这种技术。
缺点:请求必须是表单所发出的。

与URL重写和隐藏域都只适用于保持不需要跨越页面的信息,如果这些信息需要跨很多页面,那么就很难实现了。cookie可以解决URL重写和隐藏域无法解决的问题。
cookie自动的在Web服务器和浏览器间传递信息。cookie是作为HTTP标签头嵌入的,传输是由HTTP协议处理。除此以外cookie还可以设置有效期限。对于Web浏览器,每个Web服务器最多可以设置20个cookie。
缺点:用户可以设置是否禁用cookie
如果浏览器是第一次访问Web服务器,那么可以通过
Cookie cookie = new Cookie("name", "value");
然后将其添加到response,返回给Web浏览器,事实上可以完全不是浏览器。
resp.addCookie(cookie);
当浏览器再次发送对统一资源或者是同一服务器请求时,浏览器会把之前Web服务器发过来的cookie传回去。cookie也可以通过JavaScript创建和删除。
如果要访问cookie,可以在调用HttpServletRequestgetCookies()方法,然后返回一个cookie数组。比如如何读取userName的cookie

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

HttpServletResonse类并没有提供removeCookie()等类似的方法,对于cookie的操作方式也只有一种addCookie(),那么如何移除掉cookie?
cookie自身的属性中,有一个maxAge,这是用来决定cookie的有效期。
如果要使的cookie无效,只要将去这个cookie的maxAge值设置为0,然后添加给response。

userNameCookie.setMaxAge(0);
resp.addCookie(userNameCookie);

需要注意的事,cookie是保存在浏览器的,即客户端。

HttpSession对象

在所有session追踪技术中,HttpSession对象是最强大的,功能多。HttpSession在用户第一次访问某个网站自动创建,通过HttpServletRequest的getSession()方法,可以获得用户的HttpSession。
getSession() 有两个重载的方法:
HttpSession getSession()
HttpSession gerSession(boolean create)

无参的getSession()返回当前的session,没有则创建一个返回。
有参数的getSession(boolean..) 根据设置的boolean值来决定,在没有时,是否创建session。true的时候,创建返回。false的时候返回null。
可以使用getAttribute(key)/setAttribute(key,obj) 来获得回话信息。与之前的三种session追踪技术不同的是,HttpSession是保存在Web服务器端,所以是耗费内存的。所以只能将尽可能小的对象放入其中,对于保存在HttpSession里面的内容一定要慎重。现代的Servlet容器可以在内存即将满时,将HttpSession对象移到辅助设备,但是同样会影响部分性能。
添加进HttpSession中的值可以是任何对象。可以选择实现java.io.Serializable接口,以便必要时候序列化对象保存到辅助设备。
既然之前说的,HttpSesion是保存在Web服务器端的,并且由于HTTP是无状态的,所以无法记得上一次请求和这一次请求是否同一用户。那么HttpSession的原理是什么呢?
Servlet容器会为其每一个HttpSession创建一个唯一的表示符,并且将这个token发送给浏览器。在Tomcat容器中,会生成一个名为JESSIONID的cookie,或者使用URL重写技术添加至URL中。
同cookie一样的是,HttpSession也可以通过调用invalidate()方法强制是的Session过期,然后将Session绑定的对象解除绑定。
默认情况下,HttpSession会在用户静默一段时间后过期,可以通过WEB部署文件中设置session-timeout来设置session的过期时间。在Servlet中同样可以通过HttpSession的setMaxInactiveInter(int seconds)来设置过期时间。之前cookie可以通过设置0来使的cookie无效,但是HttpSession将seconds设置为0则使的session永远不会过期。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值