2010-03-26 98 views
4

我們有一個情況我們要使用過濾器的URL包含一些特定的請求參數,如:Java過濾URL模式PARAMS

 
http://mydomain.com/?id=78&formtype=simple_form&.......  
http://mydomain.com/?id=788&formtype=special_form&.......  

等,id在運行時是牽強,我僅當formtype=special_form需要在web.xml中配置過濾器。應該如何實現解決方案?過濾器可以配置正則表達式模式?

+0

爲什麼你想在過濾器映射中做到這一點?無法使用除「*」之外的任何內容,並且無論如何都可以在過濾器的doFilter方法中檢查幾乎任何東西。當你無法訪問過濾器的源代碼時,正則表達式過濾器映射將是有用的唯一條件。這是你的情況嗎? – 2010-03-26 08:40:30

+0

你必須看到一些非常糟糕的代碼,但它在那裏。我有一個java web應用程序,我繼承我需要重寫。沒有servlet!您直接訪問web-inf目錄之外的jsps,所以我必須編寫一個過濾器來攔截和阻止某些url請求。 – 2013-04-18 14:28:42

回答

6

據我所知,在web.xml中,沒有解決方案直接通過查詢字符串將請求匹配到過濾器。因此,您可以使用init-params在您的web.xml中註冊過濾器,以使過濾器可配置,並通過您的javax.servlet.Filter實施中的void init(FilterConfig filterConfig)設置模式。

package mypackage; 

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 

public class MyFilter implements Filter { 

    private String pattern; 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     // check whether we have a httpServletRequest and a pattern 
     if (this.pattern != null && request instanceof HttpServletRequest) { 
      // resolve the query string from the httpServletRequest 
      String queryString = ((HttpServletRequest) request).getQueryString(); 
      // check whether a query string exists and matches the given pattern 
      if (queryString != null && queryString.matches(pattern)) { 
       // TODO do someting special 
      } 
     } 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     this.pattern = filterConfig.getInitParameter("pattern"); 
    } 

} 

的配置看起來像這樣在你的web.xml:

<!-- MyFilter --> 
<filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>mypackage.MyFilter</filter-class> 
    <init-param> 
     <param-name>pattern</param-name> 
     <param-value>{{PATTERN HERE}}</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

進一步閱讀:
http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html

+0

謝謝,你的回答對我來說真的很神奇。非常感謝您的幫助。 謝謝, Rohit。 – 2010-03-26 12:04:05

+0

支持從Apache mod_rewrite('RewriteRule'等等)中已知的模式的過濾器可以在這裏找到:http://tuckey.org/urlrewrite/ – BalusC 2010-03-26 12:16:05

0

必須解析網址參數的過濾器的身體,不在web.xml中;

我做了這樣的事情,但我使用了一個階段監聽器,一個配置項(在配置文件中)將URL參數映射到處理特定「操作」的類的FQN(通過操作,我的意思是一個URL參數GET/POST);階段偵聽器將解析每個GET/POST中的所有URL參數,並將它們分別發送到Dispatcher。分派器的工作是調用正確的處理程序(與該URL參數的FQN相對應的單例對象)。處理程序然後只是用他收到的URL值做具體的事情。

使用濾鏡而不是相位偵聽器可以做出同樣的事情。