【问题标题】:Filter only post method request with a specific parameter name仅过滤具有特定参数名称的 post 方法请求
【发布时间】:2012-10-15 03:43:56
【问题描述】:

如何过滤带有特定参数的请求:例如仅过滤带有“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个过滤器?

【问题讨论】:

  • 一种方法可能是在过滤器类中通过执行 if/else 来省略过滤器链中的所有请求?
  • @Jhays 您可以根据需要链接任意数量的过滤器,您在实际项目中遇到什么错误?

标签: java servlets servlet-filters


【解决方案1】:

您的Filter 类将在其doFilter 方法中接收ServletRequest:这类似于常规servlet 的service 方法(或doGetdoPost,对于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");
}

【讨论】:

  • 非常感谢 pb2q。它现在工作正常,只需要为那些成功过滤的页面添加登录页面,并为无效请求添加警告。
猜你喜欢
  • 2012-06-20
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多