menggongchang / BlogIssue

博客内容:Issues形式
0 stars 0 forks source link

Tomcat与JavaWeb开发技术详解:HTTP会话的使用与管理 #5

Open menggongchang opened 6 years ago

menggongchang commented 6 years ago

HTTP会话的使用与管理

有多个客户在网站上购物,web服务器为每个客户配置了虚拟的购物车。当客户将一个商品放入购物车时。web服务器必须根据客户的身份,找到该客户的购物车,然后把商品放入其中。

1. 会话简介

会话指的就是在一段时间内,单个客户和web应用的一连串的交互过程。

如果一个web组件支持会话,意味着:

当客户访问该web组件时,servlet容器会自动查找HTTP请求中表示session ID的cookie,以及向HTTP响应结果中添加表示session ID的cookie。servlet容器还会创建新的HTTPSession 对象或者寻找已经存在的与session ID对应的HTTPSession 对象。

2. HTTPSession 的生命周期及会话范围

会话范围是指浏览器端与一个web应用进行一次会话的过程,在具体实现上会话范围与HTTPSession 的生命周期对应。

会话范围内的共享数据作为HTTPSession对象的属性而存在,因此web组件只要共享一个HTTPSession对象,就能共享会话范围内的共享数据。

2.1 生命周期的开始:以下情况会开始一个新的会话,即Servlet容器会创建一个新的HTTPSession对象。

3. jsp、servlet中使用会话

jsp默认情况支持会话,而HTTPservlet类在默认情况下不支持会话。

jsp可以通过固定变量session来引用隐含的HttpSession对象,在HTTPservlet类中可以通过request对象获取HttpSession对象;

   //使用request对象的getSession()获取session,如果session不存在则创建一个
   HttpSession session = request.getSession();
   //获取session的Id
   String sessionId = session.getId();
   //判断session是不是新创建的
   if (session.isNew()) {
       response.getWriter().print("session创建成功,session的id是:"+sessionId);
   }else {
       response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
   }

4. 处理cookie禁用的情况

常见的session实现方式是基于cookie的, 所以禁用cookie,session随之失效;

理论上只要在返回的页面里里能带上一个标识会话的令牌,在浏览器下一次提交的时候,能带上这个令牌,会话就可以被保持。

因此,cookie只是最优雅的实现session的方式,因为cookie对用户来说不可见,同时会自动在HTTP报文中传输。 但session也可以通过其他方式来保持, 比如放一个sessionId在URL的参数里 :)

response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。 response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写