2010-12-06 16 views
0
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++; 
    } 
} 

我試圖運行上面的代碼,我收到以下錯誤任何上限:是否有Cookie數量在Java

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) 

當我試圖抓住這個例外,它不進入捕獲循環。 我將約8999個值添加到cookie。 Cookie大小是否有限制?

我正在使用JBoss,這是用servlet(Java)編寫的。

請幫忙?

+0

您可能需要爲您的問題添加更多信息。何時發生這種錯誤?你發佈的代碼似乎沒有調用`arrayCopy`,所以我認爲這個錯誤來自其他地方。無論如何,Java不會對cookies有任何限制。 – 2010-12-06 13:46:31

+0

那是什麼令我困惑。實際上,這條線是打印8973次。之後,它給人的錯誤:java.lang.ArrayIndexOutOfBoundsException 在java.lang.System.arraycopy(本機方法) 此錯誤的堆棧跟蹤甚至不包括我在哪裏寫代碼的類的名稱。 – coder 2010-12-06 13:56:39

+0

你使用的是什麼版本的Tomcat? – 2010-12-09 13:33:03

回答

0

看起來這個異常發生在您的servlet代碼返回後,Tomcat正在創建響應消息。 (這就解釋了爲什麼你無法捕捉異常,以及爲什麼在堆棧跟蹤中看不到你的任何方法。)

但是,異常發生在最奇怪的地方。它看起來像write方法試圖複製數據超過消息緩衝區的末尾。但是在編寫狀態行時會發生這種情況;即響應的第一行。我能想到的唯一解釋是

  • 它以前嘗試和失敗,編寫包含餅乾頭,
  • 它試圖重新分配緩衝區,並重新開始,並
  • 出了差錯。

我認爲解決的辦法是增加Tomcat的回覆緩衝區大小,或者減小標題的大小。

2

它看起來像tomcat有一個行或頭大小限制,你正在進入。

真正的問題是爲什麼你想要使用這麼多的cookie。如果每個用戶都有很多信息,請將其存儲在會話中或服務器端數據庫中 - 不要強制每次請求都通過網絡發送它。

0

我不知道在某一特定服務器上執行任何限制,但也有對瀏覽器基礎瀏覽器的大小和Cookie數量一定的侷限性,當然這取決於的瀏覽器供應商和版本瀏覽器。