Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 546|回复: 0

[jsp学习]深入理解Servlet/JSP之Cookie和Session原理

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 01:36:42 | 显示全部楼层 |阅读模式
    由于HTTP协议的无状态特征,Web应用中经常使用Cookie和Session来保存用户在与系统交互过程中的状态数据。下面通过分析HTTP协议对Cookie和Session的工作原理加以了解。 一、Cookie Cookie的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。 下面的Servlet展示了Cookie的功能。   ... ... ...    public void doGet(HttpServletRequest request, HttpServletResponse response)
                      throws ServletException, IOException {       response.setContentType("text/HTML");
           PrintWriter out = response.getWriter();
           String option = request.getParameter("option");
           if ("show".equals(option)) {           //获得请求信息中的Cookie数据
               Cookie[] cookies = request.getCookies();
               if (cookies != null) {               //找出名称(键)为“cool”的Cookie
                   for (int i = 0; i < cookies.length; i++) {
                       if ("cool".equals(cookies.getName())) {
                           out.println("<h2>" + cookies.getName() + ":"                           + cookies.getValue() + "</h2>");
                        }
                   }
               }
           } else if ("add".equals(option)) {           //创建Cookie对象
               Cookie cookie = new Cookie("cool", "yeah!");           //设置生命周期以秒为单位
               cookie.setMaxAge(20);           //添加Cookie
               response.addCookie(cookie);
          }     ... ... ...
    该Servlet对应的url-pattern为/testCookie 当浏览器请求地址“.../tst/testCookie?option=add”时,该Servlet创建一个Cookie对象,存储的键-值对为“cool”-“yeah”。通过response的addCookie方法将该Cookie信息添加到相应信息中。需要注意的是cookie的setMaxAge方法用于设置该cookie生命周期,单位是秒,如果过了这个期间,Cookie将失效。setMaxAge方法的参数如果为负值则表示该Cookie将在浏览器关闭时过期,如果参数为0则表示立刻删除该Cookie。访问该地址,对应的请求和响应的HTTP信息为: 请求: GET /tst/testCookie?option=add HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, **
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host: 192.168.5.100:8080
    Connection: Keep-Alive
    Cookie: cool=yeah! 响应:
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 21
    Date: Sun, 29 Jun 2008 06:15:26 GMT <h2>cool:yeah!</h2> 注意,请求协议头中用于携带cookie信息的格式。   Cookie可以用于保持用户的会话状态,但Cookie信息保存在客户端,存在较大的安全隐患,且一般浏览器对Cookie的数目及数据大小有严格的限制。在Web应用中,一般情况下通过HttpSession对象保持会话状态。   二、Session Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。 存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。 1. Session工作原理 下面的Servlet用来演示Session的工作原理: ... ... ... public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {     response.setContentType("text/html");
         PrintWriter out = response.getWriter();
         String option = request.getParameter("option");
         if ("create".equals(option)) {         //获得HttpSession对象
             HttpSession session = request.getSession();         //设置Session对象的最长不活动间隔
             session.setMaxInactiveInterval(30);         //获取Session中的数据
             List list = (List) session.getAttribute("list");
             if (list == null) {
                 list = new ArrayList();
                 list.add("hey");             //向Session中添加数据
                 session.setAttribute("list", list);
             } else {
             list.add("hey");
          }
          out.println(list);
        }else if ("invalidate".equals(option)) {
            HttpSession session = request.getSession(false);
            if (session != null) {        //使Session对象失效
            session.invalidate();
        }
      }   ... ... ... 该Servlet的url-pattern为/testSession。 当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。注意,Session对象的setMaxInactiveInterval方法用于设置最长不活动间隔,单位是秒,如果出现在这个的时间段内Session对象没有被存取,则该Session对象将会失效。通常为了保证服务器的性能和出于安全性考虑,这个值要妥善的设置(Tomcat针对Session的MaxInactiveInterval会有默认的设置)。若setMaxInactiveInterval设置为负值,则表示该Session永不过期。另外,Session对象分别通过setAttribute和getAttribute方法存取数据,数据以“名称-对象”对的形式存放。该请求对应的请求和响应的HTTP信息为: 请求: GET /tst/testSession?option=create HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, **
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host: 192.168.5.100:8080
    Connection: Keep-Alive
    Cookie: JSESSIONID=C69B3053C575ECC8C7FCAF7D189A4FD1   响应
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 12
    Date: Sun, 29 Jun 2008 07:20:41 GMT   [hey, hey] 注意:请求信息中携带的SessionID值与上一次相应的SessionID之一致。另外响应输出的HTML文本中有两个“hey”,这是因为这次请求Servlet往存放在Session中的list对象中又放置了一个String对象。   当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。需要注意的是,此时获取Session对象的方法为重载的getSession(boolean b)其中boolean类型的参数表示当前请求没有和服务器端的某个Session对象关联时是创建新的Session(参数为true时)还是返回null(参数为false时)。
    2、关于URL重写   从上面的介绍可以看出,Session对象的正常使用要依赖于Cookie。如果考虑到客户端浏览器可能出于安全的考虑禁用了Cookie,应该使用URL重写的方式使Session在客户端禁用Cookie的情况下继续生效。 下面有两个JSP页面:1.jsp中向Session对象中存入了名为“hi”的一个String类型对象。通过超级链接可以链接到2.jsp,在2.jsp中将获取Session中名为“hi”的对象,并显示在页面上。需要注意的是:在1.jsp中超级链接的地址并不是直接写了“2.jsp”而是通过resopnse的encodeURL方法对这个地址进行了处理。 1.jsp <%
    session.setAttribute("hi","Do you work or are you a student?");
    %> <a href="<%=response.encodeURL("2.jsp")%>">2.jsp</a>   2.jsp <%=session.getAttribute("hi")%>   首先将浏览器的Cookie禁用(注意要重启IE),然后请求1.jsp,响应后点击链接到2.jsp,这个交互过程涉及到两次请求和相应,HTTP信息如下:   请求1.jsp GET /tst/session/1.jsp HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, **
    Referer: http://192.168.5.100:8080/tst/session/1.jsp
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host: 192.168.5.100:8080
    Connection: Keep-Alive 响应: HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 33
    Date: Sun, 29 Jun 2008 07:31:36 GMT Do you work or are you a student? 注意:由于Cookie的禁用,这次请求协议头中虽然没有携带SessionID的信息,但SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。 response的encodeURL方法将根据浏览器是否不支持Cookie决定是否将SessionID信息写入链接地址。   3、Session对象的持久化 对于一个企业级应用而言,Session对象的管理十分重要。Sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在Session中的数据需要实现可序列化接口(java.io.Serializable)的原因了。 Tomcat 5.5 服务器提供两个类用于Session对象的管理,这两个类分别是org.apache.catalina.session.StandardManager 和 org.apache.catalina.session.PersistentManager。Tomcat默认的方式是使用StandardManager来管理Session。Tomcat 5.5默认会在服务器关闭或应用重新加载时建立一个名为session.ser的文件,并将该应用对应的Session对象存放在其中,该文件位于“Tomcat主目录workCatalina localhost应用名”路径下。注意,当Tomcat重新启动或应用重新加载后会读取这个文件,载入其中的Session信息,然后把它删掉,所以如果看不到该文件是由于时机不对或者眼力不够快。 当然,可以更改Tomcat默认的Session管理方式。可以在“Tomcat主目录confCatalina”下建立应用对于的Context定义,如建立名为tst.xml的XML文件,文件的内容如下: <Context docBase="D:/Tomcat/tomcat-5.5.26/webapps/tst">
      <Manager className="org.apache.catalina.session.StandardManager" maxActiveSessions="-1"       maxInactiveInterval="60" pathname=""/>
    </Context> 通过Context元素的子元素Manager配置Session的管理对象:

    className属性用于指定管理Session的类可以是StandarManager或PersitentManager。
    maxActiveSessions表示允许最多活动Session对象的数目,-1表示不限制。
    maxInactiveInterval表示Session默认的最长不活动间隔,单位为秒。
    pathname表示StandarManager在服务器重启或应用重新加载时持久化Session对象的文件名,此处设置为“”相当于关掉了Session的持久化机制。  
       

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 07:05 , Processed in 0.446212 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表