Estou criando um controlador frontal simples e muito leve. Preciso corresponder caminhos de solicitação a diferentes manipuladores (ações) para escolher o caminho correto.
Na minha máquina local HttpServletRequest.getPathInfo()
e HttpServletRequest.getRequestURI()
retorne os mesmos resultados. Mas não tenho certeza do que eles retornarão no ambiente de produção.
Então, qual é a diferença entre esses métodos e o que devo escolher?
Respostas:
getPathInfo()
fornece as informações adicionais do caminho após o URI, usado para acessar o seu Servlet, enquanto asgetRequestURI()
fornece o URI completo.Eu pensaria que eles seriam diferentes, dado que um Servlet deve ser configurado com seu próprio padrão de URI; Acho que nunca servi um Servlet a partir da raiz (/).
Por exemplo, se o Servlet 'Foo' estiver mapeado para o URI '/ foo', eu teria pensado que o URI:
Resultaria em:
e
fonte
getRequestURI()
me dá a string"/foo/path/to/resource"
conforme o esperado, masgetPathInfo()
para o mesmoHttpServletRequest
objeto me dánull
. O que anda acontecendo no mundo? EDIT: É respondido abaixo pelo usuário "30thh".Vou colocar uma pequena tabela de comparação aqui (apenas para tê-la em algum lugar):
O servlet é mapeado como
/test%3F/*
e o aplicativo é implementado em/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
No exemplo acima, o servidor está sendo executado no
localhost:8480
e o nome30thh.loc
foi colocado nohosts
arquivo do SO .Comentários
"+" é tratado como espaço apenas na string de consulta
A âncora "#a" não é transferida para o servidor. Somente o navegador pode trabalhar com ele.
Se o
url-pattern
mapeamento no servlet não terminar com*
(por exemplo/test
ou*.jsp
),getPathInfo()
retornaránull
.Se o Spring MVC for usado
Método
getPathInfo()
retornanull
.O método
getServletPath()
retorna a parte entre o caminho do contexto e o ID da sessão. No exemplo acima, o valor seria/test?/a?+b
Cuidado com as partes codificadas por URL do
@RequestMapping
e@RequestParam
no Spring. É buggy (versão atual 3.2.4) e geralmente não está funcionando como esperado .fonte
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
brilhante.getRequestURI()
egetRequestURL()
devo retornar jsessionid não decodificado, neste casoS%3F+ID
. Pelo menos no Tomcat / 8.5.6.Vamos detalhar o URL completo que um cliente digitaria na barra de endereço para acessar seu servlet:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
As peças são:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
O URI da solicitação (retornado por getRequestURI ) corresponde às partes 4, 5 e 6.
(aliás, mesmo que você não esteja pedindo isso, o método getRequestURL fornecerá as partes 1, 2, 3, 4, 5 e 6).
Agora:
O seguinte sempre é válido (exceto para diferenças de codificação de URL):
O exemplo a seguir da especificação Servlet 3.0 é muito útil:
Nota: a imagem a seguir, não tenho tempo para recriar em HTML:
fonte
Considere o seguinte servlet conf:
Agora, quando eu clicar no URL
http://localhost:8084/JSPTemp1/NewServlet/jhi
, ele será chamadoNewServlet
conforme é mapeado com o padrão descrito acima.Aqui:
Nós temos os seguintes:
getPathInfo()
getRequestURI()
fonte