Open menggongchang opened 6 years ago
有多个客户在网站上购物,web服务器为每个客户配置了虚拟的购物车。当客户将一个商品放入购物车时。web服务器必须根据客户的身份,找到该客户的购物车,然后把商品放入其中。
会话指的就是在一段时间内,单个客户和web应用的一连串的交互过程。
如果一个web组件支持会话,意味着:
当客户访问该web组件时,servlet容器会自动查找HTTP请求中表示session ID的cookie,以及向HTTP响应结果中添加表示session ID的cookie。servlet容器还会创建新的HTTPSession 对象或者寻找已经存在的与session ID对应的HTTPSession 对象。
会话范围是指浏览器端与一个web应用进行一次会话的过程,在具体实现上会话范围与HTTPSession 的生命周期对应。
会话范围内的共享数据作为HTTPSession对象的属性而存在,因此web组件只要共享一个HTTPSession对象,就能共享会话范围内的共享数据。
2.1 生命周期的开始:以下情况会开始一个新的会话,即Servlet容器会创建一个新的HTTPSession对象。
浏览器进程第一次访问web应用中支持会话的任意一个网页;
当浏览器进程与web应用的一次会话已经被销毁后,再次访问web应用中支持会话的任意一个网页;
2.2 生命周期的结束:以下情况会话被销毁,即servlet容器内的HTTPSession对象结束生命周期,共享数据被销毁。
浏览器进程终止;->会话过期
会话过期;
服务器端执行HTTPSession对象的invalidate()方法;
当Tomcat中的web应用被终止时,会话不会被销毁,而是被Tomcat持久化到存储设备中。
当web应用重启后,Tomcat会重新加载这些会话。
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); }
常见的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地址进行重写
response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写
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对象。
浏览器进程第一次访问web应用中支持会话的任意一个网页;
当浏览器进程与web应用的一次会话已经被销毁后,再次访问web应用中支持会话的任意一个网页;
2.2 生命周期的结束:以下情况会话被销毁,即servlet容器内的HTTPSession对象结束生命周期,共享数据被销毁。
浏览器进程终止;->会话过期
会话过期;
服务器端执行HTTPSession对象的invalidate()方法;
当Tomcat中的web应用被终止时,会话不会被销毁,而是被Tomcat持久化到存储设备中。
当web应用重启后,Tomcat会重新加载这些会话。
3. jsp、servlet中使用会话
jsp默认情况支持会话,而HTTPservlet类在默认情况下不支持会话。
jsp可以通过固定变量session来引用隐含的HttpSession对象,在HTTPservlet类中可以通过request对象获取HttpSession对象;
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地址进行重写