Comment utiliser un filtre de servlet dans Java pour modifier une URL de requête de servlet entrante?

Comment puis-je utiliser un filtre de servlet pour modifier une URL de demande de servlet entrante à partir de

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

à

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


Mise à jour : selon les étapes de BalusC ci-dessous, j’ai trouvé le code suivant:

 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; Ssortingng requestURI = request.getRequestURI(); if (requestURI.startsWith("/Check_License/Dir_My_App/")) { Ssortingng toReplace = requestURI.subssortingng(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1); Ssortingng newURI = requestURI.replace(toReplace, "?Contact_Id="); req.getRequestDispatcher(newURI).forward(req, res); } else { chain.doFilter(req, res); } } @Override public void destroy() { // } } 

L’entrée pertinente dans web.xml ressemble à ceci:

  urlRewriteFilter com.example.UrlRewriteFilter   urlRewriteFilter /*  

J’ai essayé les redirections côté serveur et côté client avec les résultats attendus. Cela a fonctionné, merci BalusC!

  1. Implémentez javax.servlet.Filter .
  2. Dans la méthode doFilter() , ServletRequest le ServletRequest entrant en HttpServletRequest .
  3. Utilisez HttpServletRequest#getRequestURI() pour saisir le chemin.
  4. Utilisez des méthodes simples java.lang.Ssortingng telles que subssortingng() , split() , concat() , etc. pour extraire la partie qui vous intéresse et composer le nouveau chemin.
  5. Utilisez ServletRequest#getRequestDispatcher() puis RequestDispatcher#forward() pour transférer la demande / réponse à la nouvelle URL (redirection côté serveur, non reflétée dans la barre d’adresse du navigateur) ou ServletResponse entrant en HttpServletResponse , puis HttpServletResponse#sendRedirect() pour redirect la réponse vers la nouvelle URL (redirection côté client, reflétée dans la barre d’adresse du navigateur).
  6. Enregistrez le filtre dans web.xml sur un url-pattern d’ url-pattern de /* ou /Check_License/* , en fonction du chemin de contexte, ou si vous utilisez déjà Servlet 3.0, utilisez @WebFilter annotation @WebFilter .

N’oubliez pas d’append une coche dans le code si l’URL doit être changée et sinon, appelez simplement FilterChain#doFilter() , sinon, il s’appellera dans une boucle infinie.

Alternativement, vous pouvez également utiliser une API tierce existante pour faire tout le travail pour vous, tel que UrlRewriteFilter de Tuckey qui peut être configuré comme vous le feriez avec le mod_rewrite d’Apache.

Vous pouvez utiliser le filtre de réécriture d’URL prêt à l’emploi avec une règle comme celle-ci:

  ^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$ /Check_License?Contact_Id=My_Obj_$1  

Vérifiez les exemples pour plus d’exemples.

Un simple filtre JSF Url Prettyfier basé sur les étapes de la réponse de BalusC . Le filtre transfère toutes les requêtes commençant par le chemin / ui (en supposant que tous vos fichiers xhtml y sont stockés) sur le même chemin, mais en ajoutant le suffixe xhtml.

 public class UrlPrettyfierFilter implements Filter { private static final Ssortingng JSF_VIEW_ROOT_PATH = "/ui"; private static final Ssortingng JSF_VIEW_SUFFIX = ".xhtml"; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = ((HttpServletRequest) request); Ssortingng requestURI = httpServletRequest.getRequestURI(); //Only process the paths starting with /ui, so as other requests get unprocessed. //You can register the filter itself for /ui/* only, too if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) && !requestURI.contains(JSF_VIEW_SUFFIX)) { request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX)) .forward(request,response); } else { chain.doFilter(httpServletRequest, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } } 

Veuillez noter que si votre URL d’origine contient des parameters, à savoir http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123 ? param1 = A & param2 = B alors ces parameters seront également transmis au prochain servlet / jsp. Je n’ai pas trouvé de moyen de supprimer ou de remplacer les parameters d’origine (uniquement en utilisant HttpServletRequestWrapper). Des idées?..

Mise à jour: il semble que http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ résout ce problème.