jsp And Servlet 学习 (Session 篇)

  关于Session的使用,可以用于保存从一个客户端发出的多个请求情况的会话状态。如果只是针对一次请求的数据时,一般用request来保存信息。

    1.容器(Container)是怎么识别每一个客户端的呢?方法很简单,每个客户端需要一个唯一的session ID.
    当客户端(Client)第一次请求(request)时,容器(Container)生成一个唯一的session ID放在response中返回给客户端。当client发送后续的请求(request)时,要包含着个唯一的session ID.
    2.容器(container)和客户端是如何交换session ID情报
    一种最通常的方法,就是通过cookies来完成信息的交换。事实上,容器(container)作了所有的事情。session的取得都是通过 HttpSession session = request.getSession();
如果request中存在session ID时,返回已经存在的session,如果不存在的话,容器就为客户端生成一个唯一的session ID.
    在这里,还提供了一个带参数的方法。HttpSession session = request. getSession(boolean create),其中request.getSession(false)表示不生成新的对象,而request.getSession(true)的效果则和无参数时一样。
    新的问题又来了,如何去判断当前返回的session是不是新生成的呢。这是可以调用session.isNew()去判断。
    3.当客户端不支持cookie时,如何去交换session ID情报呢?
这时候我们可以用URL rewriting去实现,你唯一需要做的就是encode response URL。
out.println("<a href=/"" + response.encodeURL("/BeerTest.do") + "/">click</a>");
当你使用重定向时,也能使用URL rewriting.
response.encodeRedirectURL("/BeerTest.do");
URL rewriting 是自动触发的,当容器通过cookie取得session ID失败时,就会使用URL rewriting的方法。
    4.Session的失效.可以调用HttpSession的 invalidate()或者session过期。设置session过期的时间,
·       可以通过DD(Deployment Descriptor)配置:
<session-timeout>15</session-timeout>,这里的Timeouts是以分钟为单位的。这是用于所有的session.
·       还可以设定特定session的有效时间。
session.setMaxInactiveInternal(20*60)这里的Timeouts是以秒为单位的。
    5.cookie的其他用途。
默认的情况下,cookie的寿命和session一样长,当关闭浏览器时,session和cookie就失效了。但是你可以让cookie的寿命,让他一直保持有效。这样既保存一些信息,比如用户名。
    用Servlet Api 使用cookie: HttpServletRequest, HttpServletResponse, Cookie.
·       生成一个新的Cookie: Cookie cookie = new Cookie("username", name);
·       设置cookie的寿命。 cookie.setMaxAge(30*60);如果设置"-1"的话,那么cookie会在浏览器关闭时失效。
·       将cookie发送到客户端(client): response.addCookie(cookie);
·       从客户端取得cookie:
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
 Cookie cookie = cookies[i];
 if (cookie.getName().equals("username")) {
    String userName = cookie.getValue();
    out.println("Hello" + username);
    break;
 }
}
    6.session的移动
    一个session在整个web app中都是唯一的,当web app在多个JVM中发布时,此时就存在session的移动。可以使用HttpSessionActivationListener来监听session在各个JVM中的移动,让session中的属性(attributes)做好一定的准备。如果你的属性全部都是可序化(Serializable)的,那么就不会有问题。
HttpSessionActivationListener就是让所有的属性都有个可序化的机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值