2

私はそれらの「正確な」コピーを持っているように見えますが、多くの例を読みまし/login/restricted/*. WebFilter を定義するために、注釈 (以下の例のように) と XML の両方を試しました。

ウェブフィルター

@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" } )
public class AuthenticationFilter implements Filter {
    @Inject
    private SessionManager sessionManager;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("Active AuthenticationFilter");
        if (sessionManager.getUser() == null) {
            ((HttpServletResponse) response).sendRedirect("/login");
        }
        else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

web.xml

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>   
<filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping> 
    <filter-name>Pretty Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
    <filter-name>NoCacheFilter</filter-name>
    <filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>NoCacheFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/restricted/*</url-pattern>
</filter-mapping>

ノート

フィルターは両方のファイルで定義されていますが、両方の表記法を同時に使用していないことは保証できます。ただし、テストとレビューのために、両方を投稿しました。

私は webfilters の使用に不慣れで、複数のフィルターの使用について多くを見つけることができませんでした. しかし、私が読んだことは、複数を使用でき、 で定義した順序で実行されますweb.xml

質問

私のフィルターがページでも実行される理由について、誰かが手がかりを持ってい/loginますか? アプリは Glassfish 3.1.2 で実行されています。

4

1 に答える 1

7

一致条件は包括的ではなく、<filter-mapping>排他的です。

次のマッピングで

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/restricted/*</url-pattern>
</filter-mapping>

FacesServlet基本的に、が呼び出されるとき、またはURLパターンがに一致するときはいつでも、フィルターを呼び出す必要があることを指示しています/restricted/*

これは、あなたが期待しているように「and」状態ではありません。<servlet-name>エントリを削除するだけです。

その場合、適切な@WebFilter宣言は次のようになります。

@WebFilter("/restricted/*")

が必要ないと仮定します<filter-mapping>(たとえば、順序が関係ない場合)。

于 2012-10-22T21:08:07.857 に答える