Cookie 的细节


一、一次可不可以发送多个 cookie

答:可以!可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可,下面实验一下:

新建两个HttpServlet,在第一个HttpServlet中发送Cookie

@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //新建三个cookie,并通过response发送出去
        Cookie cookie1 = new Cookie("msg","hello");
        Cookie cookie2 = new Cookie("name","zhangsan");
        Cookie cookie3 = new Cookie("sex","male");
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.addCookie(cookie3);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

第二个HttpServer ,接受cookie,并打印到控制台:

@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //3. 获取Cookie,拿到数据
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
    
    
            for (Cookie cookie : cookies) {
    
    
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name + " : " + value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

运行服务器,控制台输出如下:
在这里插入图片描述

二、cookie 在浏览器中保存多长时间

在默认情况下,当浏览器关闭后,Cookie数据被销毁。

但是Cookie可以设置持久化存储,他有一个setMaxAge(int seconds)方法

这个方法的参数,有三种情况:

  • 正数:将Cookie数据写到硬盘的文件中,进行持久化存储,这个正的参数就是cookie存活的时间
  • 负数:即默认值,没有太大的意义
  • 零:删除Cookie的信息

下面演示一下参数为正数的情况:

新建一个HttpServlet,设置持久化存储时间为1000秒,并发送:

@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //新建一个Cookie,并设置持久化存储时间为1000秒
        Cookie cookie = new Cookie("msg","hello");
        //设置持久化存储时间
        cookie.setMaxAge(1000);
        //发送cookie
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

运行服务器,首先访问/cookieDemo4,然后访问/cookieDemo2(这个是打印cookie信息到控制台的),浏览器关闭,再次打开cookieDemo2,也能获取到cookie
在这里插入图片描述
两次访问结果

三、cookie 能不能存中文

答:在tomcat 8之前,cookie中不能直接存储中文数据,需要将中文数据转码(一般采用URL编码)

tomcat 8之后,cookie支持中文数据

读者可以自行实验

四、cookie 共享问题

这个问题详细一点说就是:假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中的cookie能不能共享?

答:在默认情况下cookie不能共享

但是cookie有一个方法可以设置共享,那就是setPath(String path),这个方法设置了cookie的获取范围,默认情况下,该值默认是当前项目的虚拟目录,如果要共享,只需要把path设置为一根/就好了。

演示一下:

新建一个HttpServlet,在这个类中发送一个Cookie,并且设置全局共享:

@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //新建一个Cookie,并设置持久化存储时间为1000秒
        Cookie cookie = new Cookie("msg", "你好");
        //设置共享
        cookie.setPath("/");
        //发送cookie
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

再新建一个项目,把输出cookie信息的类拷贝过去,并且加上一句话:第二个项目:

下面运行服务器,先运行第一个发送cookie的项目,然后访问新建的项目,输出如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/112673163