它確實沒有明確definied在Servlet規範,但至少HTML形式符合規範definies它明確地在application/x-www-form-urlencoded部分:/值的順序列出
2.控制的名字出現在該文件。
所以,那部分是安全的。現在,servlet容器在邏輯上是一個體面和高效的實現,它將在HTTP輸入流進入時立即處理,所以這些參數將按照它們出現在請求URI(GET)或請求體(POST)中的順序進行處理。收集他們在String[]
是最直接的選擇,因爲它也是在Servlet API中原樣使用的,所以我真的沒有看到任何理由首先在HashSet
類似的結構中收集它,或者做一個Collections#shuffle()
或其他什麼,然後之後將其轉換爲String[]
。
我至少可以從經驗中瞭解到,Tomcat是正確的,因此所有在Tomcat/Catalina(IBM Websphere,JBoss AS,Sun Glassfish等)上構建的主要容器/應用程序也將表現如此。我只是沒有Weblogic的經驗,但如果它以不同的方式處理它,我會感到驚訝(閱讀:效率較低)。
只有參數名稱的順序不能保證,因爲它是由HashMap
支持的。
總結:參數收集在HashMap<String, String[]>
。由於HashMap
的性質,名稱不予保證。這些值(一個參數名稱可以有多個值,例如foo=bar1&foo=bar2&foo=bar3
)依次排列,但由於String[]
的性質而有所不同,儘管這在Servlet API中沒有明確指定。
爲了安全起見,您希望採用不同的方法,例如,
foos=3&foo[0]=bar1&foo[1]=bar2&foo[2]=bar3
與
int foos = Integer.valueOf(request.getParameter("foos"));
for (int i = 0; i < foos; i++) {
int foo = Integer.valueOf(request.getParameter("foo[" + i + "]"));
}
由於HttpServletRequest是一個接口,它依賴於它的實現。 雖然我會很驚訝,如果有一個實現不返回收到的順序的值。 – Fortega 2010-02-23 10:32:13
接口文檔*可以*規定行爲,如果設計師如此選擇,但在這種情況下,他們沒有。 – skaffman 2010-02-23 10:39:03