Como posso usar um filtro de servlet para alterar um URL de solicitação de servlet de entrada
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
para
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
Atualização : de acordo com as etapas abaixo do BalusC, vim com o seguinte código:
public class UrlRewriteFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
//
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
String newURI = requestURI.replace(toReplace, "?Contact_Id=");
req.getRequestDispatcher(newURI).forward(req, res);
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
//
}
}
A entrada relevante aparece web.xml
assim:
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Tentei o redirecionamento do servidor e do cliente com os resultados esperados. Funcionou, obrigado BalusC!
Respostas:
javax.servlet.Filter
.doFilter()
método, transmita a entradaServletRequest
paraHttpServletRequest
.HttpServletRequest#getRequestURI()
para pegar o caminho.java.lang.String
métodos comosubstring()
,split()
,concat()
e assim por diante para extrair a parte de interesse e compor o novo caminho.ServletRequest#getRequestDispatcher()
e, em seguida,RequestDispatcher#forward()
para encaminhar a solicitação / resposta para o novo URL (redirecionamento do servidor, não refletido na barra de endereços do navegador), ou converter a entradaServletResponse
paraHttpServletResponse
e, em seguida,HttpServletResponse#sendRedirect()
redirecionar a resposta para o novo URL (redirecionamento do cliente, refletido em barra de endereço do navegador).web.xml
umurl-pattern
de/*
ou/Check_License/*
, dependendo do caminho do contexto, ou se você já estiver no Servlet 3.0, use a@WebFilter
anotação para isso.Não se esqueça de adicionar uma verificação no código se o URL precisar ser alterado e, caso contrário , basta chamar
FilterChain#doFilter()
, caso contrário ele se chamará em um loop infinito.Como alternativa, você também pode usar uma API de terceiros existente para fazer todo o trabalho para você, como o UrlRewriteFilter da Tuckey, que pode ser configurado da mesma maneira que faria com o Apache
mod_rewrite
.fonte
RequestDispatcher#forward()
for executado, o restante dos filtros não será executado. Então, não haverá uma maneira melhor do que fazer isso como um servlet?<dispatcher>FORWARD</dispatcher>
ao mapeamento do filtro.<dispatcher>FORWARD</dispatcher>
ao mapeamento do filtro.Você pode usar o filtro de reescrita de URL pronto para usar com uma regra como esta:
Veja os exemplos para mais ... exemplos.
fonte
Um simples filtro JSF Url Prettyfier baseado nas etapas da resposta do BalusC . O filtro encaminha todas as solicitações começando com o caminho / ui (supondo que você tenha todos os seus arquivos xhtml armazenados lá) para o mesmo caminho, mas adicionando o sufixo xhtml.
fonte