3 votes

Filtres : redirection côté client et côté serveur

C'est mon filtre :

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws java.io.IOException, javax.servlet.ServletException
{
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String currentURL = request.getRequestURI();
    MaintenanceService maintenanceMode = new MaintenanceService();

    if (maintenanceMode.getMaintenanceMode())
    {
        String urlNew = currentURL.concat("maintenance.jsp");
        response.sendRedirect(urlNew);

    }
    filterChain.doFilter(servletRequest, servletResponse);
}

"sous" maintenanceMode.getMaintenanceMode(), j'ai une variable getter :

boolean maintenanceMode = Boolean.getBoolean("maintenance");

Avec avant (redirection côté serveur), cela fonctionne bien, mais lorsque j'essaie la redirection côté client :

response.sendRedirect(urlNew);

J'ai eu un entretien infini occurrences.jsp concaténation :

http://localhost:8080/maintenance.jspmaintenance.jspmaintenance.jspmaintenance.jspmaintenance.jsp

pourquoi il ne redirige pas sur une seule occurrence, comme avec la redirection côté serveur :

http://localhost:8080/maintenance.jsp

Cartographie des filtres Web.xml :

<filter-mapping>
    <filter-name>maintenanceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2voto

Ramesh PVK Points 7415

Cela se produit parce que vous redirigez pour toutes les URLs, y compris maintenance.jsp . Et il en résulte une redirection infinie.

Modification de la condition de redirection pour rediriger uniquement si l'url actuelle n'est pas maintenance.jsp .

Voici comment le code se présente après ma modification :

public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,
      FilterChain filterChain)
    throws java.io.IOException, javax.servlet.ServletException
{
   HttpServletRequest request = (HttpServletRequest) servletRequest;
   HttpServletResponse response = (HttpServletResponse) servletResponse;
   String currentURL = request.getRequestURI();
   MaintenanceService maintenanceMode = new MaintenanceService();
   if (!currentURL.equals("/maintenance.jsp") 
            && maintenanceMode.getMaintenanceMode())
   {
    String urlNew = currentURL.concat("maintenance.jsp");
    response.sendRedirect(urlNew);
   }
   filterChain.doFilter(servletRequest, servletResponse);
}

Je n'ai pas compris pourquoi tu fais String urlNew = currentURL.concat("maintenance.jsp"); pour chaque url. Avez-vous maintenance.jsp page relative à chaque url. Je pense que vous devriez avoir un seul /maintenance.jsp page. Et dans ce cas, il faut toujours rediriger vers response.sendRedirect(/maintenance.jsp) quelle que soit la page à laquelle vous accédez.

0voto

amicngh Points 4464
<filter-mapping>
<filter-name>maintenanceFilter</filter-name>
<url-pattern>/*</url-pattern>

Dans le mappage du filtre, toutes vos demandes (il s'agit de nouvelles demandes puisqu'elles sont redirigées) sont éligibles à cette mesure. filter c'est la raison pour laquelle votre filtre est appelé à chaque demande pour un nombre infini de fois.

D'une part, vous pouvez appeler ce filtre pour des besoins spécifiques. url-pattern

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