Comment puis-je 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 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;
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 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!
Réponses:
javax.servlet.Filter
.doFilter()
méthode, transtypez le fichier entrantServletRequest
versHttpServletRequest
.HttpServletRequest#getRequestURI()
pour saisir le chemin.java.lang.String
méthodes commesubstring()
,split()
,concat()
et ainsi de suite pour extraire la partie d'intérêt et de composer le nouveau chemin.ServletRequest#getRequestDispatcher()
et puisRequestDispatcher#forward()
pour transférer la demande / réponse vers la nouvelle URL (redirection côté serveur, non reflétée dans la barre d'adresse du navigateur), ou caster le message entrantServletResponse
versHttpServletResponse
, puisHttpServletResponse#sendRedirect()
rediriger la réponse vers la nouvelle URL (redirection côté client, reflétée dans barre d'adresse du navigateur).web.xml
sur unurl-pattern
des/*
ou/Check_License/*
, selon le chemin de contexte, ou si vous êtes sur Servlet 3.0 déjà, utilisez l'@WebFilter
annotation pour cette place.Ne pas oublier d'ajouter un chèque dans le code si l'URL besoins à changer et si non , alors il suffit d' appeler
FilterChain#doFilter()
, sinon il va s'appeler dans une boucle infinie.Vous pouvez également simplement utiliser une API tierce existante pour faire tout le travail à votre place, telle que UrlRewriteFilter de Tuckey qui peut être configuré comme vous le feriez avec Apache
mod_rewrite
.la source
RequestDispatcher#forward()
est exécuté, le reste des filtres ne sera pas exécuté. Alors, ne sera-t-il pas un meilleur moyen de faire cela en tant que servlet?<dispatcher>FORWARD</dispatcher>
au mappage de filtre.<dispatcher>FORWARD</dispatcher>
au mappage de filtre.Vous pouvez utiliser le filtre de réécriture d'URL prêt à l'emploi avec une règle comme celle-ci:
Consultez les exemples pour plus ... d'exemples.
la source
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 vous avez tous vos fichiers xhtml stockés ici) vers le même chemin, mais en ajoutant le suffixe xhtml.
la source