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!
javax.servlet.Filter
.doFilter()
, convertissez le message ServletRequest
en HttpServletRequest
.HttpServletRequest#getRequestURI()
pour saisir le chemin.Java.lang.String
telles que substring()
, split()
, concat()
et ainsi de suite pour extraire la partie intérêt et composer le nouveau chemin.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).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.
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.
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 {
}
}