【问题标题】:Is there any maximum limit on number of cookies in javajava中cookie的数量是否有最大限制
【发布时间】:2010-12-08 06:46:45
【问题描述】:
if (!foundCookie) {
    logger.info("cooookies Not found ---  ");
    ResourceBundle appName = ResourceBundle.getBundle(
        "conf/filename", Locale.getDefault());
    Enumeration bundleKeys = appName.getKeys();
    Cookie[] cookieToBeAdded = new Cookie[9000];

    int i =0 ;
    while (bundleKeys.hasMoreElements()) {    
        logger.error((String) bundleKeys.nextElement());
        String key = (String) bundleKeys.nextElement();
        String value = appName.getString(key);
        cookieToBeAdded[i] = new Cookie(("station" + i),(key+":"+ value));
        cookieToBeAdded[i].setMaxAge(24*60*60);
        logger.error(cookieToBeAdded[i]+"cookieToBeAdded[i]");
        // logger.info("cooookies adding to response ---  " + cookieToBeAdded[i].getName() + ":" + cookieToBeAdded[i].getValue());
        response.addCookie(cookieToBeAdded[i]);

        pw.write("<Source>");
        pw.write("<name>"+value+"</name>");
        pw.write("<id>"+key+"</id>");
        pw.write("</Source>");
        i++;
    }
}

我正在尝试运行上述代码,但出现以下错误:

java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at org.apache.coyote.http11.InternalOutputBuffer.write(InternalOutputBuffer.java:680)
    at org.apache.coyote.http11.InternalOutputBuffer.sendStatus(InternalOutputBuffer.java:419)
    at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1588)
    at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:934)
    at org.apache.coyote.Response.action(Response.java:183)
    at org.apache.coyote.Response.sendHeaders(Response.java:379)
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305)
    at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:273)
    at org.apache.catalina.connector.Response.finishResponse(Response.java:486)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:636)

当我试图捕捉这个异常时,它并没有进入捕捉循环。 我正在向 cookie 添加大约 8999 个值。 cookie大小有限制吗?

我正在使用 JBoss,这是用 servlet(Java) 编写的。

请帮忙?

【问题讨论】:

  • 您可能想为您的问题添加更多信息。这个错误究竟是什么时候发生的?您发布的代码似乎没有调用arrayCopy,所以我认为错误来自其他地方。无论如何,Java 不会对 cookie 施加任何限制。
  • 这让我很困惑。实际上,该 looger 行打印了 8973 次。之后它给出错误: java.lang.System.arraycopy(Native Method) 处的 java.lang.ArrayIndexOutOfBoundsException 这个错误堆栈跟踪甚至不包括我正在编写代码的类的名称。
  • 你用的是什么版本的Tomcat?

标签: java cookies


【解决方案1】:

看来 tomcat 有您遇到的行或标题大小限制。

真正的问题是您为什么要尝试使用这么多 cookie。如果每个用户有很多信息,请将其存储在会话或服务器端数据库中 - 不要强制在每个请求时通过网络发送。

【讨论】:

  • 是的,我认为这不是正确的做法。但我只是在尝试。
【解决方案2】:

在您的 servlet 代码返回并且 Tomcat 正在创建响应消息之后,此异常似乎正在发生。 (这就解释了为什么您无法捕获异常,以及为什么您在堆栈跟踪中看不到任何方法。)

但是,异常发生在一个最奇怪的地方。看起来write 方法正在尝试将数据复制到消息缓冲区的末尾。但这是在写入状态行时发生的;即响应的第一行。我能想到的唯一解释是

  • 它之前曾尝试写入包含 cookie 的标头,但失败了,
  • 它会尝试重新分配缓冲区并重新开始,然后
  • 出了点问题。

我认为解决方法是增加Tomcat的回复缓冲区大小,或者减小标头的大小。

【讨论】:

  • 是的,这可能是问题所在。但是这些沉重的图像不是存储在 orkut、facebook 等 cookie 中的。我认为数据更重。
  • @Vikas - 是的,但他们肯定已经调整了他们的服务器端代码来处理这个问题。相比之下,您使用的是具有(我猜)默认缓冲区大小的 Tomcat。
【解决方案3】:

我不知道任何特定的服务器实现有任何限制,但每个浏览器的 cookie 的大小和数量都有明确的限制,当然这取决于浏览器供应商和浏览器版本.

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2016-05-18
    • 2022-10-13
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2012-02-24
    相关资源
    最近更新 更多