JSP Cookie 处理

  • Cookies处理

    在本章中,我们将讨论JSP中的Cookies处理。Cookies是存储在客户端计算机上的文本文件,它们被保留以用于各种信息跟踪目的。JSP使用底层servlet技术透明地支持HTTP cookie。识别和返回用户涉及三个步骤-
    • 服务器脚本将一组cookie发送到浏览器。例如,姓名,年龄或身份证号码等。
    • 浏览器将此信息存储在本地计算机上,以备将来使用。
    • 当浏览器下次发送任何请求到Web服务器时,它会将那些cookie信息发送到服务器,并且服务器使用该信息来标识用户,或者也可能出于其他目的。
    本章将教您如何设置或重置cookie,如何访问它们以及如何使用JSP程序删除它们。
  • Cookie的剖析

    Cookie通常是在HTTP标头中设置的(尽管JavaScript也可以直接在浏览器中设置Cookie)。设置cookie的JSP可能会发送类似于以下内容的标头-
    
    HTTP/1.1 200 OK
    Date: Fri, 04 Feb 2000 21:03:38 GMT
    Server: Apache/1.3.9 (UNIX) PHP/4.0b3
    Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
       path = /; domain = tutorialspoint.com
    Connection: close
    Content-Type: text/html
    
    如您所见,Set-Cookie标头包含键值对,GMT日期,path和domain。名称和值将进行URL编码。在expires字段是浏览器的指令,以“过期”给定的时间和日期后的cookie。 如果将浏览器配置为存储Cookie,则它将保留此信息直到到期日期。如果用户将浏览器指向与cookie的path和domain匹配的任何页面,它将把cookie重新发送到服务器。浏览器的标头可能看起来像这样-
    
    GET / HTTP/1.0
    Connection: Keep-Alive
    User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
    Host: www.cainiaoya.com
    
    Accept: image/gif, */*
    Accept-Encoding: gzip
    Accept-Language: en
    Accept-Charset: iso-8859-1,*,utf-8
    Cookie: name = xyz
    
    然后,JSP脚本将通过请求方法request.getCookies()来访问cookie,该方法返回一个cookie对象数组。
  • Servlet Cookies方法

    下表列出了与Cookie对象关联的有用方法,您可以在JSP中操作Cookie时使用它们-
    方法 描述
    public void setDomain(String pattern) 此方法设置cookie适用的域;例如,cainiaoya.com。
    public String getDomain() 此方法获取Cookie所适用的域;例如,cainiaoya.com。
    public void setMaxAge(int expiry) 此方法设置cookie过期之前应经过的时间(以秒为单位)。如果您未设置此项,则cookie仅在当前会话中持续存在。
    public int getMaxAge() 此方法返回cookie的最长使用期限,以秒为单位指定。默认情况下,-1表示cookie将持续到浏览器关闭为止。
    public String getName() 此方法返回cookie的名称。创建后不能更改名称。
    public void setValue(String newValue) 此方法设置与cookie关联的值。
    public String getValue() 此方法获取与cookie关联的值。
    public void setPath(String uri) 此方法设置此Cookie所应用的路径。如果您未指定路径,则会为与当前页面相同的目录中的所有URL以及所有子目录返回cookie。
    public String getPath() 此方法获取此cookie所应用的路径。
    public void setSecure(boolean flag) 此方法设置布尔值,该值指示是否仅应通过加密(即SSL)连接发送cookie。
    public void setComment(String purpose) 此方法指定描述cookie用途的注释。如果浏览器向用户显示cookie,则该注释很有用。
    public String getComment() 此方法返回描述此cookie用途的注释;如果cookie没有注释,则返回null。
  • 使用JSP设置Cookies

    使用JSP设置cookie涉及三个步骤-
    步骤1:建立Cookie物件
    您使用一个cookie名称和一个cookie值(它们都是字符串)来调用Cookie构造函数。
    
    Cookie cookie = new Cookie("key","value");
    
    请记住,名称和值均不应包含空格或以下任何字符-
    
    [ ] ( ) = , " / ? @ : ;
    
    步骤2:设定过期时间
    您可以使用setMaxAge指定cookie有效的时间(以秒为单位)。以下代码将设置一个24小时的cookie。
    
    cookie.setMaxAge(60*60*24); 
    
    步骤3:将Cookie发送到HTTP响应标头中
    您可以使用response.addCookie在HTTP响应标头中添加cookie,如下所示
    
    response.addCookie(cookie);
    
    示例::
    
    <%
       // 为 first_name  和   last_name 建立cookie
       Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
       Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
       
       // 设置24小时后过期
       firstName.setMaxAge(60*60*24); 
       lastName.setMaxAge(60*60*24); 
       
       // 在响应头中添加两个cookie。
       response.addCookie( firstName );
       response.addCookie( lastName );
    %>
    
    <html>
       <head>
          <title>Setting Cookies</title>
       </head>
       
       <body>
          <center>
             <h1>Setting Cookies</h1>
          </center>
          <ul>
             <li><p><b>First Name:</b>
                <%= request.getParameter("first_name")%>
             </p></li>
             <li><p><b>Last  Name:</b>
                <%= request.getParameter("last_name")%>
             </p></li>
          </ul>
       
       </body>
    </html>
    
    让我们将上面的代码放在main.jsp文件中,并在以下HTML页面中使用它-
    
    <html>
       <body>
          
          <form action = "main.jsp" method = "GET">
             First Name: <input type = "text" name = "first_name">
             <br />
             Last Name: <input type = "text" name = "last_name" />
             <input type = "submit" value = "Submit" />
          </form>
          
       </body>
    </html>
    
    将以上HTML内容保存在hello.jsp文件中,并将hello.jsp和main.jsp放在<Tomcat安装目录>/webapps/ROOT目录中。当您访问http://localhost:8080/hello.jsp时,这是上述形式的实际输出。
    尝试输入first_name和last_name,然后单击submit按钮。这将在屏幕上显示first_name和last_name,还将设置两个cookie firstName和lastName。下次单击“提交”按钮时,这些cookie将被传递回服务器。在下一节中,我们将解释如何在Web应用程序中重新访问这些cookie。
  • 使用JSP读取Cookies

    要读取cookie,您需要通过调用HttpServletRequestgetCookies()方法来创建javax.servlet.http.Cookie对象的数组。然后遍历数组,并使用getName()和getValue()方法访问每个cookie和关联的值。
    现在让我们阅读上一个示例中设置的cookie-
    
    <html>
       <head>
          <title>Reading Cookies</title>
       </head>
       
       <body>
          <center>
             <h1>Reading Cookies</h1>
          </center>
          <%
             Cookie cookie = null;
             Cookie[] cookies = null;
             
             // 获取与此域名关联的Cookie数组
             cookies = request.getCookies();
             
             if( cookies != null ) {
                out.println("<h2> Found Cookies Name and Value</h2>");
                
                for (int i = 0; i < cookies.length; i++) {
                   cookie = cookies[i];
                   out.print("Name : " + cookie.getName( ) + ",  ");
                   out.print("Value: " + cookie.getValue( )+" <br/>");
                }
             } else {
                out.println("<h2>No cookies founds</h2>");
             }
          %>
       </body>
       
    </html>
    
    现在让我们将上面的代码放在main.jsp文件中,然后尝试访问它。如果将first_name cookie设置为“mo”,将last_name cookie设置为“ting”,运行http://localhost:8080/main.jsp将显示以下结果-
  • 使用JSP删除Cookies

    删除Cookie非常简单。如果要删除Cookie,则只需执行以下三个步骤-
    • 读取一个已经存在的cookie并将其存储在Cookie对象中。
    • 使用setMaxAge()方法将Cookie年龄设为零,以删除现有的Cookie。
    • 将此Cookie重新添加到响应标头中。
    下面的示例将向您展示如何删除一个名为“first_name”的现有cookie ,当您下次运行main.jsp JSP时,它将为first_name返回null值。
    
    <html>
       <head>
          <title>Reading Cookies</title>
       </head>
       
       <body>
          <center>
             <h1>Reading Cookies</h1>
          </center>
          <%
             Cookie cookie = null;
             Cookie[] cookies = null;
             
             // 获取与此域名关联的Cookie数组
             cookies = request.getCookies();
             
             if( cookies != null ) {
                out.println("<h2> Found Cookies Name and Value</h2>");
                
                for (int i = 0; i < cookies.length; i++) {
                   cookie = cookies[i];
                   
                   if((cookie.getName( )).compareTo("first_name") == 0 ) {
                      cookie.setMaxAge(0);
                      response.addCookie(cookie);
                      out.print("Deleted cookie: " + 
                      cookie.getName( ) + "<br/>");
                   }
                   out.print("Name : " + cookie.getName( ) + ",  ");
                   out.print("Value: " + cookie.getValue( )+" <br/>");
                }
             } else {
                out.println(
                "<h2>No cookies founds</h2>");
             }
          %>
       </body>
       
    </html>
    
    现在让我们将上面的代码放入main.jsp文件中,然后尝试访问它。它将显示以下结果-
    现在再次运行http://localhost:8080/main.jsp,它应该仅显示一个cookie,如下所示-
    name为JSESSIONID的cookie为服务器自动生成的。
    您可以在浏览器中手动删除cookie,例如 Internet Explorer中手动删除Cookie。从“工具”菜单开始,然后选择“Internet选项”。要删除所有cookie,请单击删除 Cookies按钮。