Qual é o tamanho máximo do URL no Tomcat?

43

E é configurável? Posso configurar o Tomcat para que um URL com, digamos, 200K de parâmetros de consulta passe com êxito para o servlet contido?

Sim, eu sei que é preciso usar o POST quando você tiver muitos dados; essa é uma opção menos agradável nesse caso em particular. O aplicativo contido (um mecanismo de pesquisa) espera que uma solicitação GET realize uma pesquisa.

Michael Gundlach
fonte

Respostas:

60

Você pode editar a entrada do conector HTTP / 1.1 de tomcat / conf / server.xml e adicionar um maxHttpHeaderSize = "65536" para aumentar do máximo padrão de 8K ou mais, para 64K. Eu imagino que você poderia aumentar esse número o mais alto necessário, mas 64K são suficientes para minhas necessidades no momento, por isso não tentei.

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />
Michael Gundlach
fonte
3
Muito útil, resolvi meu problema com o Solr. Parece que estávamos arranhando o limite 8192 padrão na server.xmlconfiguração, sem perceber, e de repente atingimos. Problema doloroso: nada foi registrado sobre isso, as conexões foram silenciosamente eliminadas (não me lembro mais do status HTTP). Eu tropecei na documentação em tomcat.apache.org/tomcat-5.5-doc/config/http.html antes, no entanto, não associei o maxHttpHeaderSizenome nem a descrição a eles relacionados aos parâmetros de consulta de solicitação GET.
marca
Também atingimos o mesmo limite no Solr, nada além de uma página em branco ... :( O maxHttpHeaderSize fez o truque.
user85116
Eu acho que o maxHttpHeaderSize = "100000" não é possível, ele deve ser multiplicado por 1024. Alterei o maxHttpHeaderSize = "1048576", que é 1024 * 1024 e ainda não está funcionando.
3
Uma resposta aceita, "maxHttpHeaderSize =" 65536" não funciona Funcionou antes por causa do bug . Em Tomcat URL / URI não tem nada a ver com cabeçalhos HTTP.
Fuad Efendi
1
@FuadEfendi qual é o tamanho máximo agora?
Mjaggard
5

O comprimento de uma solicitação HTTP GET não é imposto pelo RFC2616 , como a Microsoft reporta para sua página de suporte de comprimento máximo do IE .

Portanto, o comprimento máximo de GET é um problema relacionado ao cliente (navegador) . Se o seu aplicativo for usado por pessoas, você pode forçar a usar um determinado navegador, basta encontrar qual é a duração desse suporte ao navegador.

Em todos os casos, sugiro uma olhada na página da Wikypedia sobre esses problemas relacionados ao navegador na string Query (a parte da solicitação que traz parâmetros para aplicativos do lado do servidor, a que segue o "?" Eventualmente presente em uma solicitação.

É claro que talvez o tomcat também coloque um limite no lado do servidor. A RFC diz:

Servidores devem ser capazes de lidar com o URI de qualquer recurso que eles servem, e devem ser capazes de lidar com URIs de comprimento ilimitado, se fornecerem formulários baseados em GET que possam gerar tais URIs. Um servidor deve retornar o status 414 (Request-URI Too Long) se um URI for maior do que o servidor pode suportar (consulte a seção 10.4.15).

para que você possa testar facilmente se o Tomcat tem um limite e descobrir qual é esse limite usando simplesmente solicitações diferentes, começando com uma muito longa, fornecendo o erro e diminuindo pela metade. Em seguida, use o método de bissecção para encontrar rapidamente o valor exato.

drAlberT
fonte
Albert, eu sabia que o Tomcat tinha um limite imediato (algo como 8K); Gostaria de saber se havia um limite que mesmo a configuração não poderia superar.
Michael Gundlach
2

Para o conector AJP, você precisa ajustar o packetSizeatributo:

<Connector port="8009" 
    protocol="AJP/1.3" 
    packetSize="65536" />
1615903
fonte
1
Se você estiver usando o mod_proxy, também precisará definir ProxyIOBufferSize 65536 na sua configuração httpd.
suicídio
1

Você pode alterar a configuração no servidor Tomcat (.. \ Tomcat 6.0 \ conf \ server.xml)

<Porta do conector = "8983" maxHttpHeaderSize = "100000" protocol = "HTTP / 1.1" connectionTimeout = "20000" redirectPort = "8443" />

Thalaiselvam
fonte
Você pode melhorar essa resposta formatando seu código e explicando por que ele responde à pergunta OP.
James.garriss 13/09/19