181 votes

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 l'arrivée d'un servlet url de demande de

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

pour

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

?


Mise à jour: selon BalusC les étapes ci-dessous, je suis venu avec 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;
        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() {
        //
    }
}

L'entrée correspondante en web.xml ressembler à ceci:

<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>

J'ai essayé à la fois côté serveur et côté client de redirection avec les résultats attendus. Il a travaillé, grâce BalusC!

274voto

BalusC Points 498232
  1. Mettre en oeuvre javax.servlet.Filter.
  2. En doFilter() méthode, la fonte de la entrantes ServletRequest de HttpServletRequest.
  3. Utiliser HttpServletRequest#getRequestURI() à saisir le chemin d'accès.
  4. Utilisation simple, java.lang.String méthodes comme substring(), split(), concat() et ainsi de suite pour extraire la partie de l'intérêt et de composer le nouveau chemin d'accès.
  5. Utiliser ServletRequest#getRequestDispatcher() puis RequestDispatcher#forward() de la demande/réponse à la nouvelle URL (redirection côté serveur, qui ne sont pas reflétées dans la barre d'adresse du navigateur), ou de la fonte de la entrantes ServletResponse de HttpServletResponse puis HttpServletResponse#sendRedirect() de rediriger la réponse à la nouvelle URL (côté client de redirection, reflété dans la barre d'adresse du navigateur).
  6. Enregistrer le filtre en web.xml sur url-pattern de /* ou /Check_License/*, selon le contexte chemin, ou si vous êtes sur Servlet 3.0, utilisez l' @WebFilter d'annotation à la place.

N'oubliez pas d'ajouter une case dans le code, si les URL de besoins pour être changé et si non, puis il suffit d'appeler FilterChain#doFilter(), sinon il va s'appeler lui-même dans une boucle infinie.

Sinon, vous pouvez aussi utiliser une 3ème partie de l'API de faire tout le travail pour vous, comme Tuckey de UrlRewriteFilter qui peuvent être configurés de la manière que vous le feriez avec Apache mod_rewrite.

21voto

Pascal Thivent Points 295221

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

 <rule>
  <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
  <to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>
 

Vérifiez les exemples pour plus d'exemples.

2voto

Lopotun Points 93

Veuillez noter que si votre URL d'origine contient des paramètres, c'est à dire http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123?param1=A&param2=B alors ces paramètres sera aussi transmis à côté de servlet/jsp. Je n'ai pas trouver un moyen de se débarrasser de ou de remplacer les paramètres d'origine (uniquement à l'aide de HttpServletRequestWrapper). Des idées?..

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X