web.xml - Filtros Java Servlet - No está ejecutando antes de procesar la página JSP (en Tomcat)

StackOverflow https://stackoverflow.com/questions/1720670

Pregunta

Soy bastante nuevo en Servlet Filtros y básicamente he unido a un proyecto de utilizarlos y añadido un filtro adicional en el fichero de web.xml (desplegado en Tomcat 5.5 ).

Estoy 95% seguro de que en algún momento se estaba trabajando correctamente, pero ahora al depurar si pongo los puntos de corte en la parte superior de la página JSP que estoy tratando de ver (login.jsp), es página de la plantilla (page.jsp) y dentro de los dos método doFilter() del filtro configurado; que se ejecuta a través de la totalidad de la página login.jsp (de arriba abajo), entonces page.jsp y se inicia el procesamiento de los filtros.

Lo necesito para ejecutar los filtros primero, ya que uno de ellos determina el idioma de la página debe mostrarse en (cookies de cheques, los ajustes y la configuración del navegador db) que luego debe aplicarse a la login.jsp.

¿Alguien tiene alguna sugerencia en cuanto a lo que podría ir mal?

Hay una gran cantidad de código que pude a publicar, pero no estoy convencido de que sería de alguna utilidad, ya que todo está trabajando sólo en el orden equivocado.

Fragmentos del web.xml:

<web-app>
...
<filter>
        <filter-name>SetSecurityContextFilter</filter-name>
        <filter-class>
            com.section2.SecurityContextServletFilter
        </filter-class>
    </filter>

<filter>
    <filter-name>SetLocaleFilter</filter-name>
    <filter-class>
        com.section2.locale.LocaleServletFilter
    </filter-class>
</filter>

<filter>
    <filter-name>trinidad</filter-name>
    <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
</filter>

<filter>
    <filter-name>ActiveUserFilter</filter-name>
    <filter-class>com.section2.ActiveUserFilter</filter-class>
</filter>

    <filter-mapping>
        <filter-name>trinidad</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

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

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

    <filter-mapping>
        <filter-name>ActiveUserFilter</filter-name>
        <url-pattern>/pages/section2/user/*</url-pattern>
    </filter-mapping>

...
</web-app>

Gracias de antemano.

¿Fue útil?

Solución 2

Gracias por sus respuestas - Ahora han comprendido plenamente el problema ... que sólo ocurre para la página login.jsp, ninguna de las otras páginas. Y en mi caso, la página login .jsp es un caso especial, ya que se ve generalmente como resultado de una redirección.

En el web.xml:

<login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/login.jsp?error=true</form-error-page>
        </form-login-config>
    </login-config>

Y supongo que debido a esto, los filtros no se ven afectados en el orden habitual! Se ha añadido una llamada desde la página de inicio de sesión para hacer lo que hace el filtro y todo está bien.

Gracias de nuevo.

Otros consejos

¿Cómo se organiza el código Filter? ¿Está quizá llamar primero FilterChain#doFilter() y sólo después de hacer la lógica necesaria?

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // Any code here will be executed BEFORE passing request through JSP/Servlet.
    chain.doFilter(request, response);
    // Any code here will be executed AFTER passing request through JSP/Servlet.
}

La razón de que el filtro de no fueron llamados para login.jsp es que la interpretación de Tomcat de la especificación es que la autenticación es parte del contenedor, que no forma parte de la aplicación web, por lo que se produce fuera del papel de los filtros. Por lo tanto filtros no se aplican a la página de inicio de sesión (login.jsp en este caso) o j_security_check.

ref: https://issues.apache.org/bugzilla/show_bug. cgi id = 21795 -?. el título solamente referencias j_security_check, pero la discusión cubre todo el mecanismo de autenticación basada en formularios

Un error evidente es en la asignación de filtros Trinidad. No debe tener un nombre de servlet, sino una url-pattern.

Yo tenía el mismo problema cuando escribí:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
   }
   chain.doFilter(request, response);
}

en lugar

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
      return;
   }
   chain.doFilter(request, response);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top