過濾器是Servlet 2.3中定義的,可以對Servlet容器傳給web組件的ServletRequest和ServletResponse對象進行檢查和修改。過濾器本身不會產生ServletRequset和ServletResponse對象??梢詾閣eb組件提供一下功能:
1.在調用web組件之前檢查ServletRequest對象,修改請求頭和修改正文內容,或者對請求進行預處理操作。
2.在web組件被調用之后檢查ServletResponse對象。修改響應頭和響應正文。
過濾器的特點:
1.可以檢查ServletRequest和ServletResponse對象,并利用ServletRequestWrapper和ServletResponseWrapper包裝類來修改這兩個對象。
2.可以在web文件中為過濾器映射特定的url。請求這些url時,servlet會先觸發過濾器工作。
3.servlet2.3以上的版本都支持過濾器。
4.多個過濾器可以串聯在一起,協同過濾請求對象和響應對象。
創建過濾器
所有的過濾器類都要實現javax.servlet.Filter接口。有三個必須實現的方法。
1.init(FilterConfig config)servlet容器創建FilterConfig對象,讓后創建Filter對象,調用init(FilterConfig)方法.config可以讀取web.xml中為配置的初始化參數。
2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)請求url和配置url相同時調用這個方法。用于訪問后續過濾器或者web組件。
3.destroy()銷毀對象調用。
過濾器的生命周期
1.初始化,web應用啟動,servlet容器加載過濾器類,創建過濾器配置對象和過濾器對象。調用init方法。
2.運行時,只有過濾器映射url和請求url匹配時,調用doFilter方法。
3.銷毀階段,web應用終止時。servlet容器調用destroy方法,銷毀對象。
發布過濾器
要在web.xml中加入Filter。
<filter> <description></description> <filter-name>名字</filter-name> <filter-class>過濾器的class路徑</filter-class> <init-param>//參數可以有多個,可以用FilterConfig.getInitParameter(String name)來得到 <description></description> <param-name></param-name> <param-value></param-value> </init-param> <init-param> <param-name></param-name> <param-value></param-value> </init-param> </filter> <filter-mapping> <filter-name>跟上面的名字對應</filter-name> <url-pattern>/*</url-pattern>/*為過濾所有 </filter-mapping>串聯過濾器
web.xml中一個請求url與多個過濾器匹配就可以串聯。按順序調用,先調用第一個過濾器的doFilter方法,然后執行chain.doFilter之前的方法,然后執行chain.doFilter,跳到第二個過濾器,在執行chain.filter之前的方法.同理一直到最后一個過濾器的chain.doFilter,調用servlet方法。結束后返回前一個過濾器,執行chain.doFilter之后的方法。
使用自定義的wrapper繼承ServletRequestWrapper,修改里面的方法,把自定義的Wrapper傳給chain.doFilter()中的request就可以修改request對象,同理也可以修改response響應內容。
新聞熱點
疑難解答