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 给出的答案正在我的TEST PROJECT上工作,但在我的真实项目中插入时出现错误。我想问是否可以使用2个过滤器?

4

1 回答 1

3

您的Filter类将ServletRequest在其doFilter方法中收到 a:这类似于常规 servlet 的service方法(或doGet, doPost, for HTTPServlet)。

在您的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 回答