web.xml - Java Servlet Filtros - Não sendo executado antes de processar a página JSP (no Tomcat)

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

Pergunta

Eu sou bastante novo para Servlet Filters e têm, basicamente, se juntou a um projeto de usá-los e adicionado um filtro adicional para o arquivo web.xml (implantado em Tomcat 5.5 ).

Estou 95% certo de que em algum momento ele estava funcionando corretamente, mas agora quando a depuração se eu colocar pontos de interrupção no topo da página JSP Eu estou tentando view (login.jsp), é página do modelo (page.jsp) e dentro de dois doFilter() método do filtro configurado; que atravessa toda a página login.jsp (cima para baixo), então page.jsp e os do início do processamento dos filtros.

Eu preciso que ele seja executado os filtros primeiro, pois um deles determina o idioma da página deve ser exibida em (verificação cookies, configurações db e configurações do navegador), que deve aplicar-se ao login.jsp.

Alguém tem alguma sugestão sobre o que poderia estar acontecendo de errado?

Há um monte de código que poderia ser postagem, mas não estou convencido de que iria ser de alguma utilidade, uma vez que está tudo funcionando apenas na ordem errada.

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

Agradecemos antecipadamente.

Foi útil?

Solução 2

Obrigado por suas respostas - Eu já compreenderam a questão totalmente ... isso só acontece para a página login.jsp, nenhuma das outras páginas. E no meu caso, a página login .jsp é um caso especial porque ele é geralmente visto como um resultado de um redirecionamento.

No 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>

E eu presumo que por causa disso, os filtros são não bater na ordem de costume! Adicionado uma chamada a partir da página de login para fazer o que o filtro faz e tudo está bem.

Obrigado novamente.

Outras dicas

Como é o código Filter organizado? É você talvez chamando primeira FilterChain#doFilter() e só depois fazer a lógica necessária?

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.
}

A razão que do filtro não foram chamados para login.jsp é que a interpretação de Tomcat da especificação é que a autenticação é parte do recipiente, não faz parte do webapp, e assim ocorre fora o papel de filtros. Daí filtros não são aplicados para a página de login (login.jsp neste caso) ou j_security_check.

ref: https://issues.apache.org/bugzilla/show_bug. ? cgi id = 21795 -. o título apenas referências j_security_check, mas as tampas de discussão todo o mecanismo de autenticação baseada em formulário

Um erro óbvio está no mapeamento de filtro Trinidad. Não deve ter um nome de servlet, mas a url-padrão.

Eu tive o mesmo problema quando escreveu:

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

em vez

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   if(...) {
      response.sendRedirect(url);
      return;
   }
   chain.doFilter(request, response);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top