Servlet中的Cookie使用

Cookie就是存储在客户端的一小段文本。

Cookie包含名称,单个值和可选属性,例如注释,路径和域限定符,有效时长和版本号等信息。

1 Cookie运行原理

默认情况下,每个请求都被视为一个新请求。在Cookie技术中,我们通过来自Servlet的响应添加Cookie。因此,Cookie存储在浏览器的缓存中。之后,如果用户发送了请求,则默认情况下将Cookie与请求一起发送过来。这样,服务器就可以识别用户为旧用户。

2 Cookie的分类

Servlet中有两种Cookie。

  1. 非永久性Cookie
  2. 永久性Cookie

2.1 非永久性Cookie

它仅对当前单个会话有效。每次用户关闭浏览器时都会将其删除。

2.2 永久性Cookie

它在多次会话中都有效。用户每次关闭浏览器时都不会将其删除。仅在用户注销将其删除。

3 Cookie的优势

  1. 维持状态的最简单技术。
  2. Cookies在客户端维护。

4 Cookie的特点

  1. 如果从浏览器禁用cookie,它将无法正常工作。
  2. Cookie对象中只能设置文本(字符串)信息。

5 Cookie的API

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

5.1 Cookie类的构造方法

构造方法 说明
Cookie() 构造一个Cookie。
Cookie(String name, String value) 构造包含指定名称和值的Cookie。

5.2 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的值。

6 操作Cookie的方法

为了添加Cookie或获取Cookie的值,我们需要其他接口提供的一些方法。如下:

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

7 创建Cookie的方法

创建Cookie的示例:

Cookie ck=new Cookie("user","yiidian");//创建Cookie对象
response.addCookie(ck);//把Cookie添加到响应中 

8 删除Cookie的方法

删除cookie的代码示例,它主要用于注销或注销用户:

Cookie ck=new Cookie("user","");//删除指定name的Cookie值
ck.setMaxAge(0);//把时长改为0  
response.addCookie(ck);//把Cookie添加到响应中

9 读取所有Cookie

获取所有Cookie的简单示例:

Cookie ck[]=request.getCookies();  
for(int i=0;i<ck.length;i++){  
   out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//打印输出Cookie的name和value  
}  

10 Cookie的案例

在下面示例中,我们将用户名存储在Cookie对象中,并在另一个Servlet中获取这些Cookie数据。因为每个用户的Cookie数据是存在浏览器中的。所以,如果您使用不同的浏览器,则会得到不同的Cookie值。

10.1 编写页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>一点教程网-Cookie的案例</title>
    <meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<form action="servlet1" method="post">
    用户名:<input type="text" name="userName"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

10.2 编写FirstServlet

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

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{

            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            String n=request.getParameter("userName");
            out.print("欢迎 "+n);

            Cookie ck=new Cookie("uname",n);//创建Cookie对象
            response.addCookie(ck);//把Cookie添加到响应

            //创建提交按钮
            out.print("<form action='servlet2'>");
            out.print("<input type='submit' value='提交'>");
            out.print("</form>");

            out.close();

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

10.3 编写SecondServlet

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{

            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();

            Cookie ck[]=request.getCookies();
            for(Cookie c:ck){
                if(c.getName().equals("uname")){
                    out.print("你好 "+c.getValue());
                }
            }

            out.close();

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

10.4 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

</web-app>

10.5 运行测试

点击提交,看到下面效果:

再次点击提交,效果如下:

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码