2012-10-15 13 views
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個過濾器?

+0

一種方法可能是在Filter類中,通過執行if/else來省略來自過濾器鏈的所有請求? – kosa

+0

@Jhays您可以根據需要鏈接儘可能多的過濾器,您在實際項目中遇到什麼錯誤? – pb2q

回答

3

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 

    // ... 
} 

我不知道你在期待着與您的配置文件中PARAMS做什麼,但如果你想指定 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"); 
} 
+0

非常感謝pb2q。它現在工作正常,只需爲已成功過濾的用戶添加着陸頁,併爲無效請求提供警告。 – Jhays

相關問題