java中的cookie数量是否有任何最大限​​制

时间:2010-12-06 13:37:34

标签: java cookies

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)

当我尝试捕获此异常时,它不会进入catch循环。 我在cookie中添加了大约8999个值。 饼干大小有限制吗?

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

请帮帮忙?

3 个答案:

答案 0 :(得分:2)

看起来tomcat有一个你遇到的行或标题大小限制。

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

答案 1 :(得分:0)

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

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

  • 以前曾尝试过编写包含Cookie的标题
  • 尝试重新分配缓冲区并重新开始,
  • 出了点问题。

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

答案 2 :(得分:0)

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