Berapa panjang maksimum URL di Tomcat?

43

Dan apakah ini dapat dikonfigurasi? Dapatkah saya mengatur Tomcat sehingga URL dengan, katakanlah, 200K params kueri berhasil melewati servlet yang terkandung?

Ya, saya tahu seseorang harus menggunakan POST ketika Anda memiliki banyak data; itu pilihan yang kurang menyenangkan dalam kasus khusus ini. Aplikasi yang terkandung (mesin pencari) mengharapkan permintaan GET untuk melakukan pencarian.

Michael Gundlach
sumber

Jawaban:

60

Anda dapat mengedit entri Konektor HTTP / 1.1 tomcat / conf / server.xml, dan menambahkan maxHttpHeaderSize = "65536" untuk meningkat dari maksimum default 8K atau lebih, menjadi 64K. Saya membayangkan bahwa Anda dapat menaikkan angka ini setinggi yang diperlukan, tetapi 64K sudah cukup untuk kebutuhan saya saat ini sehingga saya belum mencobanya.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />
Michael Gundlach
sumber
3
Sangat berguna, menyelesaikan masalah saya dengan Solr. Tampaknya kami sedang menggaruk batas default 8192 di server.xmlkonfigurasi, tanpa memperhatikan, dan tiba-tiba menabraknya. Gotcha yang menyakitkan: tidak ada yang dicatat tentang hal itu, koneksi terputus secara diam-diam (saya tidak ingat Status HTTP lagi). Saya sengaja menemukan dokumentasi di tomcat.apache.org/tomcat-5.5-doc/config/http.html sebelumnya, namun saya tidak mengaitkannya maxHttpHeaderSizedengan namanya atau deskripsinya yang terkait dengan parameter permintaan kueri GET sendiri.
tandai
Kami juga baru saja mencapai batas yang sama di Solr, hanya halaman putih kosong ... :( The maxHttpHeaderSize melakukan trik.
user85116
Saya pikir maxHttpHeaderSize = "100000" tidak mungkin, harus di kalikan dengan 1024. Saya telah mengubah maxHttpHeaderSize = "1048576" yaitu 1024 * 1024 dan masih belum berfungsi.
3
Jawaban yang diterima, "maxHttpHeaderSize =" 65536 " tidak berfungsi. Ini berfungsi sebelumnya karena bug di Tomcat. URL / URI tidak ada hubungannya dengan HTTP Header.
Fuad Efendi
1
@ FuadFendi apa ukuran maksimumnya sekarang?
mjaggard
5

Panjang permintaan HTTP GET tidak diberlakukan oleh RFC2616 , karena Microsoft melaporkan untuk halaman dukungan panjang maks IE .

Jadi, panjang GET maksimum adalah masalah yang terkait dengan klien (browser) . Jika aplikasi Anda digunakan oleh orang-orang yang dapat Anda paksa untuk menggunakan browser yang diberikan maka Anda hanya dapat menemukan berapa lama dukungan browser ini.

Dalam setiap kasus saya sarankan melihat ke halaman Wikypedia tentang masalah-masalah yang terkait dengan browser pada string Kueri (bagian dari permintaan yang membawa parameter untuk aplikasi sisi server, yang mengikuti "?" Akhirnya hadir dalam permintaan.

Tentu saja mungkin kucing jantan akan memberikan batasan juga, di sisi server. RFC mengatakan:

Server HARUS dapat menangani URI dari sumber daya apa pun yang mereka layani, dan HARUS menangani URI dengan panjang yang tidak terbatas jika mereka menyediakan formulir berbasis GET yang dapat menghasilkan URI tersebut. Server HARUS mengembalikan status 414 (Permintaan-URI Terlalu Panjang) jika URI lebih panjang daripada yang bisa ditangani server (lihat bagian 10.4.15).

sehingga Anda dapat dengan mudah menguji apakah Tomcat memiliki batas dan mencari tahu apa batas ini hanya menggunakan permintaan yang berbeda dimulai dengan permintaan yang sangat lama memberikan kesalahan dan turun setengahnya. Kemudian gunakan metode membagi dua untuk dengan cepat menemukan nilai yang tepat.

drAlberT
sumber
Albert, saya sadar bahwa Tomcat memiliki batas di luar kotak (kira-kira 8K); Saya bertanya-tanya apakah ada batasan yang bahkan konfigurasi tidak dapat atasi.
Michael Gundlach
2

Untuk konektor AJP, Anda perlu menyesuaikan packetSizeatribut:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />
1615903
sumber
1
Jika Anda menggunakan mod_proxy, Anda perlu mengatur ProxyIOBufferSize 65536 konfigurasi httpd Anda juga.
Bunuh diri
1

Anda dapat mengubah konfigurasi di server Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Konektor port = "8983" maxHttpHeaderSize = "100000" protokol = "HTTP / 1.1" connectionTimeout = "20000" redirectPort = "8443" />

Thalaiselvam
sumber
Anda dapat meningkatkan jawaban ini dengan memformat kode Anda dan menjelaskan mengapa jawabannya menjawab pertanyaan OP.
james.garriss