WEB状态管理机制剖析(cookie、session)

1、状态管理

    (1)状态管理的含义

        将浏览器与web服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据(即状态)保存下来。

    (2)如何进行状态管理

        1)将状态保存在客户端
            将状态存放到浏览器(cookie技术)。
        2)将状态保存在服务器端
            将状态存放到web服务器(session技术)。

2、cookie    

     (1)什么是cookie?

            属于客户端的状态管理技术。
            浏览器访问web服务器时,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来;当浏览器再次访问服务器,会将之前保存的这些数据以cookie消息头的方式发送给服务器。

     (2)创建cookie

            (即让服务器发送set-cookie消息头给浏览器)
            Cookie c = new Cookie(String name,String value);
            name:cookie的名称
            value:cookie的值
            response.addCookie(c);

     (3)查看cookie

            Cookie[]  request.getCookies();
            注意:
                该方法有可能返回null。
            String cookie.getName();
            String cookie.getValue();

     (4)编码问题

            cookie只能存放合法的ascii字符,如果要保存中文,很显然需要将中文转换成合法的ascii字符。
            String URLEncoder.encode(String str,"utf-8");
            String URLDecoder.decode(String str,"utf-8");

     (5)生存时间

            cookie.setMaxAge(int seconds);
            注意
                a,单位是秒
                b,seconds > 0 : 浏览器会将cookie保存在硬盘上,超过指定时间,会删除这个cookie。
                  seconds = 0:删除cookie。
                          比如,要删除一个名称为user的cookie
                              Cookie c = new Cookie("user","");
                              c.setMaxAge(0);
                              response.addCookie(c);
                  seconds < 0: 默认值,浏览器会将cookie保存在内存里面,只有浏览器不关闭,cookie会一直存在。  

     (6)路径问题

             a,什么是路径问题
                 浏览器在向服务器发请求时,会比较cookie的路径与请求地址是否匹配,只有匹配的cookie才会发送给服务器。
             b,cookie的默认路径等于创建cookie的组件的路径。
             比如:
                 /web06_3/sub01/addCookie.jsp,则该jsp创建的cookie的路径等于"/web06_3/sub01"
             c,匹配规则
                 要访问的地址必须是cookie的路径或者其子路径,浏览器才会发送该cookie
             d,设置cookie的路径
                 cookie.setPath(String path);
                 经常设置为
                     cookie.setPath("/appname");
                这样,可以保证某个组件所创建的cookie可以被同一个应用内部其他的组件访问到。

      (7)cookie的限制

             a, cookie可以被用户禁止。
             b, cookie不安全,如果有敏感数据,最好不要以cookie方式来保存。如果一定要保存,一定要加密。
             c, cookie只能够保存少量的数据(大约4k)
             d, 浏览器保存的cookie的数量也有限制,大约是300个。

             e, cookie只能保存字符串。

3、session(会话)

       (1)session是什么?

        一种服务器端的状态管理技术(将状态保存在服务器上)
        当浏览器访问web服务器时,服务器会创建一个session对象(该对象有一个唯一的id属性值,类似于一个人的身份证号码一样,一般称之为sessionId),接下来服务器在默认情况下,会将sessionId以set-cookie消息头的方式发送给浏览器;
        当浏览器再次访问服务器时,会将sessionId以cookie消息头的方式发送过来,服务器依据sessionId就可以找到之前创建的session对象。
        注意:如果用户禁止cookie,可以使用其它的方式来发送sessionId。

      (2)如何获得session对象(session创建和使用流程剖析)

        方式一
            HttpSession session =  request.getSession(boolean flag);
            当flag为true时
                服务器会先查看请求当中有没有sessionId,如果没有,服务器会创建一个session对象;如果有,服务器会依据sessionId查找对应的session对象,如果找到了,则返回,找不到,创建一个新的session对象。
            当flag为false时
                服务器会先查看请求当中有没有sessionId,如果没有,返回null;如果有,服务器会依据sessionId查找对应的session对象,如果找到了,则返回,找不到,返回null。

               服务器创建和使用session对象的流程如下:

       

          1-2.浏览器请求Web服务器,服务器生成某个servlet。
          3.服务器创建某个session对象,该对象可以在servlet中通过request.getSession(boolean flag);获取。
          4.服务器以cookie的方式发送sessionId。
          5.浏览器将sessionId保存在浏览器内存中。
          6.浏览器再次访问服务器时会携带sessionId(浏览器不能关闭,否则session失效)。
          7.session对象存在的情况下,服务器会依据sessionId查找到session对象。如果找不到且flag为true,则生成新session对象
。 

        方式二
            HttpSession session = request.getSession();
            等价于request.getSession(true)。

       (3)常用的方法

        String getId();
        setAttribute(String name,Object obj);
        //如果依据绑订名找不到绑订值,返回null。
        Object getAttribute(String name);
        //解除绑定
        removeAttribute(String name);

      (4)session的超时

        1).什么是session超时?
            服务器会将空闲时间过长的session对象删除掉。
        (因为session对象会占用服务器的内存空间,服务器有可能会有大量的session对象需要维护,为了节省内存空间的占用,经常需要删除一些不太活跃的session对象)。
        2)服务器默认的超时限制
            大部分服务器默认的超时限制是30分钟。
        3)修改服务器默认的超时限制
            比如,要修改tomcat的超时限制
            tomcat_home/conf/web.xml文件
        <session-config>
        <session-timeout>30</session-timeout>
        </session-config>
         也可以将上述配置放到某个应用对应的web.xml文件当中,此时,该配置只针对某个应用起作用。
         4) setMaxInactiveInterval(int seconds);
             设置超时限制,单位是秒。
         5)立即删除session对象
            invalidate();

      (5)用户禁止cookie以后,如何继续使用session?

        1)可以使用url重写来解决这个问题
        2)什么是url重写?
                 浏览器向服务器发请求时,要使用这样的地址(在原有的地址后面添加sessionId)。这样一来,浏览器每次向服务器发请求时,服务器就可以依据sessionId找到之前的session对象了。
       3)如何进行url重写?
        a,链接地址、表单提交
            response.encodeURL(String url);
        比如:
            <a href="<%=response.encodeURL("some")%>">
            </a>
            <form action="<%=response.encodeURL("add.do")%>">
            </form>
        b,重定向    
            response.encodeRedirectURL(String url);
        比如:
            response.sendRedirect(
            response.encodeRedirectURL("abc.jsp"));
        c,转发不用考虑。因为转发是服务器内部一个组件通过容器调用另外一个组件,与session无关。

4、session相关的案例

     (1)session验证

       1),登录模块
           step1,建表
           create table t_user(
               id int primary key auto_increment,
               username varchar(50) unique,
               pwd varchar(30),
               name varchar(255),
               gender char(1)
           )type=innodb;
           insert into t_user(username,pwd,name,gender)
           values('kitty','test','hello kitty','m');
           unique : 唯一性约束。
           step2,创建一个web工程 web07_login
           step3,实体类 User
           step4, UserDAO
                   public User findByUsername(String username)
           step5,login.jsp
           step6,ActionServlet

      2),session验证

          step1,登录成功以后,在session对象上绑订一些数据。比如
              session.setAttribute("user",user);
          step2,对于需要保护的资源(登录成功以后才能访问的地址,比如main.jsp),添加session验证代码。比如
              Object obj = session.getAttribute("user");
              if(obj == null){
                  //没有登录,跳转到登录页面
                  response.sendRedirect("login.jsp");
              }

            如,用户在未登录情况下访问需要登录的界面,服务器处理过程如下图所示:

          

            1-2.浏览器请求Web服务器,服务器生成某个servlet。
          3.服务器创建某个session对象,该对象可以在servlet中通过request.getSession(boolean flag);获取。
          4.服务器以cookie的方式发送sessionId。
          5.浏览器将sessionId保存在浏览器内存中。

          6.Servlet对象获取session中的属性“user”,判断用户是否登录过。
          7.jsp中判断,若从session中取不到user对象,表示未登录过,则通过服务器发送重定向请求(302状态码)。
          8.浏览器重新访问重定向的地址,即登录界面。
             ......

5、比较session和cookie

     相对于cookie,session的优点:
        a,安全
        b,能够保存更丰富的数据类型
     缺点:
        session是将状态保存在服务器端,会占用大量的服务器的内存空间(服务器可以将状态临时保存到文件或者数据库)。



转载请注明出处:

http://blog.csdn.net/daijin888888/article/details/51133155


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值