1.什么是Session
l 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。
l Session技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
l 客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。
2.同一用户的不同页面共享数据(Session)
3.Session的跟踪机制
l WEB应用程序创建了与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的HttpSession对象。
l HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
l Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车。
4.Session的超时管理
l WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。
l 随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。
l WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
l 如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
l 会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5. 一些细节
l 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
l Session和Cookie的主要区别在于:
• Cookie是把用户的数据写给用户的浏览器。
• Session技术把用户的数据写到用户独占的session中。
l Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
6. IE禁用Cookie后的session处理
l 解决方案:URL重写
• response. encodeRedirectURL(java.lang.String url)
• 用于对sendRedirect方法后的url地址进行重写。
• response.encodeURL(java.lang.String url)
• 用于对表单action和超链接的url地址进行重写
l 附加:
• Session的失效
• Web.xml文件配置session失效时间
7. 例子:实验演示禁用Cookie后servlet共享数据导致的问题。
packagecom.csdn.session;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
publicclass Session3 extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throwsServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
request.getSession();
//情况二:解决客户端关闭cookie的情况,用encodereiectURL方法把id带给再次访问的session
String url1 = response.encodeRedirectURL("/CookieAndSession/Session1");
String url2 =response.encodeRedirectURL("/CookieAndSession/Session2");
pw.print("<ahref='"+url1+"'>购买</a><br><br>");
pw.print("<ahref='"+url2+"'>结账</a>");
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
8.例子:创建一个cookie,使session产生的id保存在客户端,是为了防止客户购买商品时不小心关了浏览器,再次打开结账没有刚才选的商品的情况
Session1.java
packagecom.csdn.session;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
publicclass Session1 extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
HttpSession hs = request.getSession();
//情况一:创建一个cookie,使session产生的id保存在客户端,是为了防止客户购买商品时不小心关了浏览器,再次打开结账没有刚才选的商品的情况
String id = hs.getId();
Cookie cookie = newCookie("JSESSIONID",id);
cookie.setMaxAge(30*60);
response.addCookie(cookie);
hs.setAttribute("name", "手机");
}
public void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Session2.java
packagecom.cs
dn.session;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
publicclass Session2 extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
HttpSession hs = request.getSession();
String value =(String)hs.getAttribute("name");
response.getWriter().write("您购买的商品是:"+value);
}
public void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}