仅过滤具有特定参数名称的post方法请求

时间:2012-10-15 03:43:57

标签: java servlets servlet-filters

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

1 个答案:

答案 0 :(得分:3)

您的Filter课程将在doFilter方法中收到ServletRequest:这类似于常规servlet的service方法(或doGet,{{ 1}},用于doPost)。

HTTPServlet方法中,使用doFilter检查所需参数的请求:如果参数不存在,则该方法将返回ServletRequest.getParameter

如果参数不存在,则阻止请求:不要使用null将其传回过滤器链。

伪代码:

FilterChain.doFilter

我不确定您对配置文件中的params有什么期望,但是如果要在请求中指定哪个 HTTP查询参数,则可以使用此config / code combo:

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

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

    // ...
}

然后在您的<param-name>required_parameter_name</param-name> <param-value>csrf-token</param-value> 方法中:

init