Servlet Cookies

Cookie是在多个客户端请求之间持久存储的一小段信息。

Cookie具有名称,单个值和可选属性,例如注释,路径和域限定符,生存周期和版本号。

默认情况下,每个请求都被视为新的请求。在cookie技术中,servlet响应可以添加cookie。 所以cookie存储在浏览器的缓存中。之后,如果用户发出请求,默认情况下会带上cookie。 因此,我们就可以知道用户旧用户。

Servlet中有2种类型的Cookie。

  • 非持久性cookie
  • 持久性Cookie

非持久性cookie

  • 它仅适用于单个会话。当用户关闭浏览器时都会删除它。

持久性Cookie

  • 它对多个会话有效。当用户关闭浏览器时也不会删除它。只有在用户注销或注销时才被删除。
  • 维持状态最简单的技术。
  • Cookie在客户端维护。
  • 如果从浏览器中禁用Cookie,则无法正常工作。
  • 只能在Cookie对象中设置文本信息。

javax.servlet.http.Cookie类提供了使用Cookie的功能。它为Cookie提供了很多有用的方法。

Cookie类的构造方法

构造方法 描述
Cookie() 构建一个cookie。
Cookie(String name, String value) 构造具有指定名称和值的cookie。

Cookie类的方法

下面中给出了一些常用的Cookie类方法。

方法 描述
public void setMaxAge(int expiry) 设置cookie的最大生命周期(以秒为单位)。
public String getName() 返回cookie的名称。创建后无法更改名称。
public String getValue() 返回cookie的值。
public void setName(String name) 更改cookie的名称。
public void setValue(String value) 更改cookie的值。

使用Cookies所需的其他方法

要添加cookie或从cookie获取值,需要其他接口提供的一些方法。它们分别是:

  • public void addCookie(Cookie ck)HttpServletResponse接口的方法用于在响应对象中添加cookie。
  • public Cookie[] getCookies()HttpServletRequest接口的方法用于从浏览器返回所有的cookie。

下面来看看创建cookie的简单代码。

Cookie ck=new Cookie("user","maxsu jaiswal");//creating cookie object  
response.addCookie(ck);//adding cookie in the response

如何删除Cookie?

下面来看看删除cookie的简单代码。它主要用于注销或注销用户。

Cookie ck=new Cookie("user","");//deleting value of cookie  
ck.setMaxAge(0);//changing the maximum age to 0 seconds  
response.addCookie(ck);//adding cookie in the response

下面来看看简单的代码用来获取所有的cookies。

Cookie ck[]=request.getCookies();  
for(int i=0;i<ck.length;i++){  
    out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//printing name and value of cookie  
}

在这个例子中,我们将用户名称(username)存储在cookie对象中,并在另一个servlet中访问它,会话对应于特定用户。所以如果从多个浏览器访问指定cookie名称,那么将得到不同的值。

打开Eclipse,创建一个动态Web项目:CookieServlet,其完整的项目结构如下 -

以下是几个主要代码文件。

文件:index.html -

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookies In Servlet</title>
</head>
<body>
    <div style="text-align:center;">
        <form action="servlet1" method="post">
            用户名:<input type="text" name="username" value="Maxsu"/><input
                type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

文件:FirstServlet.java -

package com.zaixian;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class FirstServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();

            String name = request.getParameter("username");
            String username = new String(name.getBytes("ISO-8859-1"),"utf-8");

            out.print("<!DOCTYPE html>\r\n" + 
                    "<html>\r\n" + 
                    "<head>\r\n" + 
                    "<meta charset=\"UTF-8\"><body>");
            out.print("欢迎您, " + username);

            Cookie ck = new Cookie("uname", username);// creating cookie object
            response.addCookie(ck);// adding cookie in the response

            // creating submit button

            out.print("<form action='servlet2' method='post'>");
            out.print("<p>Cookies已在浏览器中设置,现在跳转到第二个Servlet中读取Cookies的值。</p>");
            out.print("<input type='submit' value='提交到第二个Servlet'>");
            out.print("</form>");

            out.close();

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

文件:SecondServlet.java -

package com.zaixian;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SecondServlet
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            Cookie ck[] = request.getCookies();
            out.print("Hello " + ck[0].getValue());
            out.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

文件:web.xml -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>CookieServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>FServlet</servlet-name>
    <servlet-class>com.zaixian.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FServlet</servlet-name>
    <url-pattern>/servlet1</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>SServlet</servlet-name>
    <servlet-class>com.zaixian.SecondServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SServlet</servlet-name>
    <url-pattern>/servlet2</url-pattern>
  </servlet-mapping>
</web-app>

在完成上面代码编写后,部署这个Web应用程序,打开浏览器访问URL: http://localhost:8080/CookieServlet , 如是程序没有错误,应该会看到以下结果 -

提交后,看到以下界面 -

在第二个Servlet中读取的Cookies值如下 -


上一篇: Servlet会话跟踪 下一篇: Servlet登录注销Cookies实例