【JavaWeb】Cookie共享问题

标签: JavaWeb开发

上一篇: 会话技术Cookie和Session详解.

1.Cookie共享问题

1.1 同一个Tomcat服务器

  1. 正常的cookie只能在一个应用中(简单理解,就是一个目录)共享,即一个cookie只能由创建它的应用获得。默认情况下cookie不能被多个Web应用共享,
  2. 比如我的Web项目下面有两个应用:Test1Test2,在Test1中创建自己应用的cookie,没有设设置Path属性的情况下,那么在Test2下是肯定拿不到的。很容易忽视的一点:Cookie path默认是产生cookie的应用的路径。
  3. 如果Test2需要共享Test1中的cookie:就要用到Cookie类的setPath(String uri); 该方法的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如Tomcat下面的webapp)
  4. Test1设置cookie时,增加一条cookie.setPath("/");可以在webapp文件夹下的所有应用共享cookie
    或者cookie.setPath("/Test2"); 指Test1应用设置的cookie只能在Test2应用下的获得,即便是产生这个cookieTest1应用也不可以。
  5. 如果设置了cookie.setPath("/Test2/myinfo"); 只有在Test2/myinfo下面可以获得该cookie,在Test2下面但是在myinfo文件夹外的都不能获得cookie。非常严格。
  6. 那设置多条cookie.setPath("XXX");语句呢? 答案是最后一条语句才会起作用,符合了我们的经验。

1.1.1 验证

这个例子是用户第一次访问Tes1应用时,创建2个Cookie对象,cookie是用户第一次访问的时间,cookie1是上一次访问时间;用户再访问Tes1应用,读取两个cookie,页面显示出用户第一次访问的时间和上一次访问时间;
在这里插入图片描述
Test1代码:

package Test;

import ...
rvlet(name = "Test.Test1", urlPatterns = "/Test.Test1")
public class Test1 extends HttpServlet {

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //指定服务器的编码方式UTF-8,防止发生乱码
        response.setContentType("text/html;charset=utf-8");

        //用户第一次访问服务器的时间
        String firstAccessTime=null;
        //用户上一次访问服务器的时间
        String lastAccessTime = null;
        // 获取所有的cookie,并将这些cookie存放在数组中
        Cookie[] cookies = request.getCookies();
        // 遍历cookies数组
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("firstAccess".equals(cookies[i].getName())) {
                // 如果cookie的名称为firstAccess,则获取该cookie的值
                firstAccessTime = cookies[i].getValue();
            }
            if ("lastAccess".equals(cookies[i].getName())) {
                // 如果cookie的名称为lastAccess,则获取该cookie的值
                lastAccessTime = cookies[i].getValue();
                break;
            }
        }
        //判断是否存在名称为lastAccess的cookie
        if (lastAccessTime == null) {
            response.getWriter().print("您是首次访问本站!!!");
            String nowTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss")
                    .format(new Date());
            Cookie cookie1 = new Cookie("firstAccess", nowTime);
            response.addCookie(cookie1);
        } else {
            response.getWriter().println("您上次的访问时间是: "
                    + lastAccessTime+"<br>");
            response.getWriter().println("您第一次访问时间是: "
                    + firstAccessTime+"<br>");
        }
        // 创建cookie,将当前时间作为cookie的值发送给客户端
        String currentTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());
        Cookie cookie = new Cookie("lastAccess", currentTime);
        //设置cookie最大存在时间
        cookie.setMaxAge(60*60); //以秒为单位,此处为3600秒
        // 发送 cookie
        response.addCookie(cookie);
    }
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

修改上述代码:添加一条语句cookie1.setPath("/Test2");

if (lastAccessTime == null) {
            response.getWriter().print("您是首次访问本站!!!");
            String nowTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss")
                    .format(new Date());
            Cookie cookie1 = new Cookie("firstAccess", nowTime);
            cookie1.setPath("/Test2");
            response.addCookie(cookie1);
        } else {
            response.getWriter().println("您上次的访问时间是: "
                    + lastAccessTime+"<br>");
            response.getWriter().println("您第一次访问时间是: "
                    + firstAccessTime+"<br>");
        }

在这里插入图片描述
在这里插入图片描述

Test2的代码:

package Test;

import ...
rvlet(name = "Test2",urlPatterns = "/Test2")
public class Test2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //指定服务器的编码方式UTF-8,防止发生乱码
        response.setContentType("text/html;charset=utf-8");

        //用户第一次访问服务器的时间
        String firstAccessTime=null;
        // 获取所有的cookie,并将这些cookie存放在数组中
        Cookie[] cookies = request.getCookies();
        // 遍历cookies数组
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("firstAccess".equals(cookies[i].getName())) {
                // 如果cookie的名称为firstAccess,则获取该cookie的值
                firstAccessTime = cookies[i].getValue();
                break;
            }else
                firstAccessTime="没有找到访问时间";
        }
        response.getWriter().println("您第一次访问时间是: " + firstAccessTime+"<br>");
    }
}

修改Test1代码:cookie1.setPath("/");
访问Test1
在这里插入图片描述
查看Cookie

在这里插入图片描述
访问Test2
在这里插入图片描述

1.2 不同的Tomcat服务器

Domain表示的是cookie所在的域,默认为请求的地址,如网址为www.cjdx.net/test/test.aspx,那么Domain默认为www.jb51.net。

  1. 跨域共享cookie的方法:用到setDomain(String path); 方法,该参数是的域名,如果一级域名相同,那么多个服务器之间cookie可以共享。
  2. 如果服务器A所在的域是:t1.test.com,A有一个Web应用Test1;
    服务器B所在的域是:t2.test.com,B有一个应用Test2。
  3. 那么在Test1中设置cookie时,使用语句cookie.setDomain(".test.com");,这样在Test2中就可以取到这个cookie,还可以在默认的t1.test.com下共享。注意这个参数必须以"."开始

版权声明:本文为mdong9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mdong9/article/details/105734346