web-dev-qa-db-fra.com

Comment utiliser un filtre de servlet dans Java pour modifier l'URL d'une demande de servlet entrante?

Comment utiliser un filtre de servlet pour modifier l'URL d'une demande de servlet entrante?

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 décrites ci-dessous par BalusC, j'ai créé 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 pertinente dans web.xml ressemble à 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 redirection côté serveur et côté client avec les résultats attendus. Cela a fonctionné, merci BalusC!

177
Frank
  1. Implémentez javax.servlet.Filter .
  2. Dans la méthode doFilter() , convertissez le message ServletRequest en HttpServletRequest .
  3. Utilisez HttpServletRequest#getRequestURI() pour saisir le chemin.
  4. Utilisez des méthodes simples Java.lang.String telles que substring() , split() , concat() et ainsi de suite pour extraire la partie intérêt et composer le nouveau chemin.
  5. Utilisez soit 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 convertissez le --- ServletResponse en HttpServletResponse puis HttpServletResponse#sendRedirect() pour rediriger la réponse vers le nouveau 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_ de _/*_ ou _/Check_License/*_, en fonction du chemin de contexte, ou si vous êtes déjà sur Servlet 3.0, utilisez la commande @WebFilter annotation pour cela à la place.

N'oubliez pas d'ajouter une coche dans le code si l'URL doit être modifié et si pas , il suffit d'appeler - FilterChain#doFilter() , sinon il s'appellera lui-même dans une boucle infinie.

Vous pouvez également utiliser une API tierce existante pour effectuer tout le travail à votre place, par exemple rlRewriteFilter de Tuckey , qui peut être configuré comme vous le feriez avec le _mod_rewrite_ d'Apache.

268
BalusC

Vous pouvez utiliser le prêt à utiliser Filtre de réécriture d'URL 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.

20
Pascal Thivent

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

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String 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);
        String 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 {

    }

}
5
Xtreme Biker