保存会话数据的两种技术,第一种已经写了,今天重点写 Session 技术; Cookie Cookie 是客户端技术,服务器把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样, web 资源处理的就是用户各自的数据了。 Session Session 是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。 首先了解一下什么是Session 技术: 使用 Cookie 和附加 URL 参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。 Session 技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。 客户端需要接收、记忆和回送 Session 的会话标识号, Session 可以且通常是借助 Cookie 来传递会话标识号
Session 的跟踪机制 : Servlet API 规范中定义了一个 HttpSession 接口, HttpSession 接口定义了各种管理和操作会话状态的方法。 HttpSession 对象是保持会话状态信息的存储结构,一个客户端在 WEB 服务器端对应一个各自的 HttpSession 对象。 WEB 服务器并不会在客户端开始访问它时就创建 HttpSession 对象,只有客户端访问某个能与客户端开启会话的 Servlet 程序时, WEB 应用程序才会创建一个与该客户端对应的 HttpSession 对象。 WEB 服务器为 HttpSession 对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给 WEB 服务器, WEB 服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的 HttpSession 对象。
WEB 应用程序创建了与某个客户端对应的 HttpSession 对象后,只要没有超出一个限定的空闲时间段, HttpSession 对象就驻留在 WEB 服务器内存之中,该客户端此后访问任意的 Servlet 程序时,它们都使用与客户端对应的那个已存在的 HttpSession 对象。 HttpSession 接口中专门定义了一个 setAttribute 方法来将对象存储到 HttpSession 对象中,还定义了一个 getAttribute 方法来检索存储在 HttpSession 对象中的对象,存储进 HttpSession 对象中的对象可以被属于同一个会话的各个请求的处理程序共享。 Session 是实现网上商城的购物车的最佳方案,存储在某个客户 Session 中的一个集合对象就可充当该客户的一个购物车。 Session 的超时管理 WEB 服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器, WEB 服务器还要保留与之对应的 HttpSession 对象。 随着时间的推移而不断增加新的访问客户端, WEB 服务器内存中将会因此积累起大量的不再被使用的 HttpSession 对象,并将最终导致服务器内存耗尽。 WEB 服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求, WEB 服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的 HttpSession 对象变成垃圾。 如果客户端浏览器超时后再次发出访问请求, WEB 服务器则认为这是一个新的会话的开始,将为之创建新的 HttpSession 对象和分配新的会话标识号。 会话的超时间隔可以在 web.xml 文件中设置,其默认值由 Servlet 容器定义。 <session-config> <session-timeout>30</session-timeout> </session-config> 在 WEB 开发中,服务器可以为每个用户浏览器创建一个会话对象( session 对象),注意:一个浏览器独占一个 session 对象 ( 默认情况下 ) 。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的 session 中,当用户使用浏览器访问其它程序时,其它程序可以从用户的 session 中取出该用户的数据,为用户服务。 Session 和 Cookie 的主要区别在于: Cookie 是把用户的数据写给用户的浏览器。 Session 技术把用户的数据写到用户独占的 session 中。 Session 对象由服务器创建,开发人员可以调用 request 对象的 getSession 方法得到 session 对象。
今天讲的总的可以归为三点: 第一个就是 首先是 request.getSession(); 方法,如果是第一次获取,原先没有 Session 技术;服务器会自动向浏览器返回一个 id; HttpSession session=request.getSession();// 可以带参数,如果是 true 代表没有自动创建, false 代表没有也不创建; session.setAttribute(“name”,”nameValue”);// 为 session 属性赋值; 然后在创建一个 Servlet 类,来获取 session 的值; 首先解决乱码问题; response.setContentType(“text/html;charset=utf-8”); PrintWriter out = response.getWriter(); // 获取 session 的 id HttpSession session = resquest.getSession(); String value = session.getAttribute(“name”); out.print(“购买的商品是”+value); 第二种就是 把这两个弄成一个 html 文件,进行超连接,第一个叫购物。第二个叫结账 有这个一种情况,你购物完之后,获取一个 id 但是不小心关了,再重新点开,打开结账发现值为空,是不是很纠结;所以解决一下这个问题, 需要在购物内加入一个 Cookie 来保存这个 id 到本地; 创建 cookie 应该都会了吧,在这里也就不详细介绍了, 首先获取一个 session 的 id ,放到 cookie 里保存; String id = session.getID(); Cookie cookie = new Cookie(“JESSIONID”,id);// 参数值与 session 一致 cookie.setMaxAge(30*60);// 与浏览器保存时间一致; response.addCookie(cookie); 第三种就是用户把浏览器的 Cookie 设置关闭,导致 cookie 无法使用; 这个需要使用 URL 重写; IE 禁用 Cookie 后的 session 处理 解决方案: URL 重写 response. encodeRedirectURL(java.lang.String url) 用于对 sendRedirect 方法后的 url 地址进行重写。 response. encodeURL(java.lang.String url) 用于对表单 action 和超链接的 url 地址进行重写 |
|