web.xml - Filtres Java Servlet - Ne pas être exécuté avant traitement de la page JSP (sur Tomcat)

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

Question

Je suis assez nouveau pour Servlet Filtres et ont essentiellement rejoint un projet en les utilisant et a ajouté un filtre supplémentaire au fichier web.xml (déployé sur Tomcat 5.5 ).

Je suis sûr à 95% que, à un moment donné, il a été fonctionne correctement mais maintenant lors du débogage si je mets des points d'arrêt en haut de la page JSP Je suis en train de voir (login.jsp), il est la page de modèle (page.jsp) et dans les deux la méthode d'doFilter() de filtre configuré; il traverse l'ensemble de la page login.jsp (de haut en bas), puis page.jsp et le début du traitement des filtres.

J'ai besoin pour exécuter les filtres d'abord, puisque l'un d'entre eux détermine la langue la page doit être affiché dans (les cookies de contrôle, les paramètres db et les paramètres du navigateur) qui devrait alors demander au login.jsp.

Quelqu'un at-il des suggestions quant à ce qui pourrait aller mal?

Il y a beaucoup de code que je pourrais posterai mais ne suis pas convaincu que serait de toute utilisation car il est tout simplement travailler dans le mauvais ordre.

Snippets du 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>

Merci d'avance.

Était-ce utile?

La solution 2

Merci pour vos réponses - J'ai maintenant compris la question à fond ... il ne se produit que pour la page login.jsp, aucun des autres pages. Et dans mon cas, la page login .jsp est un cas particulier car il est généralement considéré comme un résultat d'une redirection.

Dans le 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>

Et je suppose à cause de cela, les filtres ne sont pas touchés dans l'ordre habituel! Ajout d'un appel de la page de connexion pour faire ce que le filtre fait et tout va bien.

Merci encore.

Autres conseils

Comment est le code Filter organisé? Êtes-vous d'appeler peut-être d'abord FilterChain#doFilter() et seulement faire par la suite la logique nécessaire?

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 raison pour laquelle ce filtre n'ont pas été appelé à login.jsp est que l'interprétation de Tomcat de la spécification est que l'authentification fait partie du conteneur, ne fait pas partie de la webapp, et se produit en dehors du rôle si des filtres. Par conséquent les filtres ne sont pas appliqués à la page de connexion (login.jsp dans ce cas) ou j_security_check.

ref: https://issues.apache.org/bugzilla/show_bug. cgi id = 21795 de -. le titre que des références j_security_check, mais la discussion couvre tout le mécanisme d'authentification par formulaire

Une erreur évidente est dans le mappage de filtre trinidad. Il ne devrait pas avoir un servlet nom, mais un modèle d'URL.

J'ai eu le même problème quand je l'ai écrit:

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

au lieu

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
      return;
   }
   chain.doFilter(request, response);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top