2

特定のパラメータでリクエストをフィルタリングするにはどうすればよいですか。たとえば、「csrf-token」パラメータ名でリクエストのみをフィルタリングします。フィルターは、要求に必要なパラメーター名があるかどうかを最初に確認し、必要なパラメーターのないものはバイパスします。

以下はweb.xmlファイルをセットアップする方法ですが、問題はすべてのリクエストがフィルタリングされることです:

<filter>
    <filter-name>CSRFTest</filter-name>
    <filter-class>org.example.CSRFFilter</filter-class>
    <init-param>
        <param-name>csrf_token</param-name>
        <param-value>csrf</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CSRFTest</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>CrossSiteScriptStripper</filter-name>
    <filter-class>CrossSiteScriptStripperFilter</filter-class>
</filter>

<!-- Apply the CrossSiteScriptStripper filter to all servlets and JSP pages. -->
<filter-mapping>
    <filter-name>CrossSiteScriptStripper</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

pb2q によって与えられた回答はテスト プロジェクトで機能していますが、実際のプロジェクトに挿入するとエラーが発生します。2つのフィルターを使用することは可能ですか?

4

1 に答える 1

3

あなたのクラスはそのメソッドでFiltera を受け取ります: これは通常のサーブレットのメソッド (または, for ) に似ています。ServletRequestdoFilterservicedoGetdoPostHTTPServlet

doFilterメソッドで、 を使用して必要なパラメーターのリクエストを確認しますServletRequest.getParameter。パラメーターが存在しない場合、メソッドは を返しnullます。

パラメータが存在しない場合は、リクエストをブロックします。 を使用してフィルタ チェーンに戻さないでくださいFilterChain.doFilter

擬似コード:

public void doFilter(ServletRequest req, ServletResponse resp,
                     FilterChain chain)
{
    // ...

    if (req.getParameter(MY_PARAMNAME) != null)
        chain.doFilter(req, resp);
    // otherwise don't call doFilter

    // ...
}

構成ファイルのパラメーターで何を期待しているのかわかりませんが、リクエストで必要な HTTP クエリ パラメーターを指定する場合、次の構成/コードの組み合わせを使用できます。

<param-name>required_parameter_name</param-name>
<param-value>csrf-token</param-value>

次に、あなたのinit方法で:

public void init(FilterConfig filterConfig)
{
    // ...

    // use this value in your doFilter method, in place of MY_PARAMNAME, above
    this.requiredParameterName =
        filterConfig.getInitParameter("required_parameter_name");
}
于 2012-10-15T03:51:01.363 に答える