首页 > 代码库 > 会话之session技术(第七次课)

会话之session技术(第七次课)

什么是Session

使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。

Session技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。

客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。

同一用户的不同页面共享数据(Session)



Session的跟踪机制

1.Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。

2.HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。

3.WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与该客户端对应的HttpSession对象。

4.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>

 

 

session实现原理

 

 

IE禁用Cookie后的session处理

解决方案:URL重写

response. encodeRedirectURL(java.lang.String url)

用于对sendRedirect方法后的url地址进行重写。

 

response. encodeURL(java.lang.String url)

用于对表单action和超链接的url地址进行重写

 

 

 

Session和Cookie的主要区别

 

  • Cookie是把用户的数据写给用户的浏览器。
  • Session技术把用户的数据写到用户独占的session中。
  • Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

 

 

 

session实现原理

 

1.服务器是如何实现一个session为一个用户浏览器服务的?

 

   服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问 服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。可以用如下的代码证明:

 

 

package lqy;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class SessionDemo1 extends GenericServlet {    @Override    public void service(ServletRequest arg0, ServletResponse arg1)            throws ServletException, IOException {        HttpServletRequest request=(HttpServletRequest)arg0;        HttpServletResponse response=(HttpServletResponse)arg1;                    response.setCharacterEncoding("UTF=8");            response.setContentType("text/html;charset=UTF-8");            //使用request对象的getSession()获取session,如果session不存在则创建一个            HttpSession session = request.getSession();            //将数据存储到session中            session.setAttribute("data", "孤傲苍狼");            //获取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);            }            }}

 

第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器,如下图所示:(留意响应头)

 

点击刷新按钮,再次请求服务器,此时就可以看到浏览器再请求服务器时,会把存储到cookie中的session的Id一起传递到服务器端了,如下图所示:(留意请求头)

 

猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理

 

//获取session的IdString sessionId = session.getId();//将session的Id存储到名字为JSESSIONID的cookie中Cookie cookie = new Cookie("JSESSIONID", sessionId);//设置cookie的有效路径cookie.setPath(request.getContextPath());response.addCookie(cookie);

 

会话之session技术(第七次课)