JavaEE session机制

JavaEE session机制

Http协议:

     在讲session之前,必须说下Http协议,HTTP是一个客户端和服务器端请求和应答的标准(TCP)。由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

     也就是Http协议是无状态保持功能的,所以我们说下我们的session机制,就是为了保存对应浏览器的身份识别功能的。

 

Session技术:
    1,什么是session(会话)
      在服务器端维护用户状态的一种状态管理技术,其实现过程:当浏览器发给你文服务器时,服务器会创建一个对象(称为session对象),
      该对象有一个唯一的id号(称为sessionId),然后,服务器在默认情况下,会使用cookie技术,将sessionId发送给浏览器,
      浏览器下次访问服务器时,会将sessionId携带给服务器。服务器会依据该sessionId查找到对应的session对象(用户的状态可以写到session对象上)。
    2,如何创建session对象?
      1),HttpSessionsession =request.getSession();//服务器会创建一个符合HttpSesion接口标准定义的session对象
      2),HttpSessionsession = request.getSession(boolean flag);
        当flag为true:
        浏览器发送请求给服务器,服务器会查看请求中有无sessionId,若没有,则创建一个session对象;
        若有,还要看要查找的那个session对象是否仍然存在(因为某种原因,比如超时限制,服务器会删掉session对象),有存在则返回;若不存在则创建一个新的对象
        当flag为false:
        浏览器发送请求给服务器,服务器会查看请求中有无sessionId,若没有,返回一个null;
        若有,还要看要查找的那个session对象是否仍然存在(因为某种原因,比如超时限制,服务器会删掉session对象),有存在则返回;若不存在则返回一个null
      3),HttpSessionsession =request.getSession();  等价于 HttpSessionsession = request.getSession(true);
    3,session中的常用方法
      session.setAttribute(Stringname,Object obj);
      Objectsession.getAttribute(String name);//一般要得到后转型
      session.removeAttribute(Stringname);//去除某个属性
      Stringsession.getId();
    4,设置sesion的最大不活动时间
      session.setMaxInactiveInerval(intseconds);
      session.invalidate();//使之立即失效
    5,使用配置文件,设置session的失效时间,
      方式一,设置整个服务器的配置失效时间,这个方式会影响到该服务器上的所有应用。Tomcat默认30分钟
       TOMCAT_HOME/conf/web.xml
       <session-config>
        <session-timeout>30</session-timeout>
       </session-config>
      方式二,针对某个特定的应用进行配置失效时间
       只需要修改web.xml
       <session-config>
        <session-timeout>30</session-timeout>
       </session-config>
    6,例子:
     A,对要保护的页面进行session验证
      session的验证:
       1,在登录成功后,写入数据做一个session属性添加
         <%
          session.setAttribute("user",user);
         %>
       2,在要保护的页面加上session验证代码
         <%
          Objectobj = session.getAttribute("user");
          if(null== obj){
           response.sendRedirect("login.jsp");
          }
         %>
       3,为了安全起见(有些时候浏览器没关,session还是存在的),做一个安全退出
         HttpSessionsession = request.getSession();
         session.invalidate();//使之失效
         response.sendRedirect("login.jsp");
     B,购物车
       Product:产品
        idlong,
        modelString,
        picNameString,
        proDescString,
        pricedouble;
       CartItem:商品条目
        productProduct,
        quantityint;
       Cart:购物车
        itemsList<CartItem>,
        booleanadd(CartItem item),
        List<CartItem>list(),
        delete(longid),
        clear(),
        modify(longid, int quantity),
        doublecost();
    7,如果用户禁止了cookie,如何实现session机制?(如何实现sessionId的跟踪)
     使用URL重写机制:
       如果要访问的web组件(jsp或者servelt),需要session机制的支持(用到session的对象),
       但是浏览器端却禁止了cookie技术,那么不能直接在地址栏输入要访问的web组件的定制,而要用服务器生成的地址,
       而应该使用服务器生成的一个地址(该地址后会携带sessionId)
     如何生成一个携带sessionId的地址?
       A。对于链接、表单提交,使用response.encodeURL("url地址")。
          比如:<ahref="<%=response.encodeURL("url")%>"></a>
       B。对于重定向,使用response.encodeRedirectURL("url地址")。
          比如:response.sendRedirect(response.encodeRedirectURL("url地址") );
       C。对于转发,无须考虑,因为在服务器内部的跳转,无须与浏览器交互,不予考虑

 

Session机制原理图:

原文出自:http://blog.sina.com.cn/s/blog_6c21f6480100vllc.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。