日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java过滤器Filter

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java过滤器Filter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡介

Servlet中的過濾器Filter是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是過濾字符編碼、做一些業務邏輯判斷如是否有權限訪問頁面等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應 (Request、Response)統一設置編碼,簡化操作;同時還可進行邏輯判斷,如用戶是否已經登陸、有沒有權限訪問該頁面等等工作。它是隨你的 web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀,以下通過代碼示例來了解它 的使用。

二、實例

package test.filter; import ...; /*** 介紹過濾器的使用,以設置編碼為例*/ public class MyFilter implements Filter { private FilterConfig config = null; private boolean isFilter = false;public void destroy() { System.out.println("MyFilter準備銷毀..."); } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { // 強制類型轉換 HttpServletRequest request = (HttpServletRequest)arg0; HttpServletResponse response = (HttpServletResponse)arg1; // 獲取web.xm設置的編碼集,設置到Request、Response 中 request.setCharacterEncoding(config.getInitParameter("charset")); response.setContentType(config.getInitParameter("contentType")); response.setCharacterEncoding(config.getInitParameter("charset")); // 將請求轉發到目的地繼續執行chain.doFilter(request, response);} public void init(FilterConfig arg0) throws ServletException { this.config = arg0; if(isFilter){System.out.println("MyFilter初始化..."); }} private void setIsFilter(boolean isFilter){this.isFilter = isFilter;} }

然后在web. xml中配置該過濾器:

<filter><filter-name>MyFilter</filter-name><filter-class>test.filter.MyFilter</filter-class><init-param><param-name>isFilter</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是默認request方式的 --><dispatcher>FORWARD</dispatcher><dispatcher>ERROR</dispatcher><dispatcher>INCLUDE</dispatcher></filt

三、詳細介紹

在doFilter方法中通常都做些什么呢,下面列舉一下:

1、通過控制對chain.doFilter的方法的調用,來決定是否需要訪問目標資源。

比如,可以在用戶權限驗證等等。判斷用戶是否有訪問某些資源的權限,有權限放行,沒權限不執行chain.doFilter方法。
2、在調用chain.doFilter方法之前,做些處理來達到某些目的。
比如,解決中文亂碼的問題等等。可以在doFilter方法前,執行設置請求編碼與響應的編碼。甚至可以對request接口進行封裝裝飾來處理get請求方式的中文亂碼問題(重寫相應的request.getParameter方法)。
3、在調用chain.doFilter方法之后,做些處理來達到某些目的。
比如對整個web網站進行壓縮。在調用chain.doFilter方法之前用類A對response對象進行封裝裝飾,重寫getOutputStream和重寫getWriter方法。在類A內部中,將輸出內容緩存進ByteArrayOutputStream流中,然后在chain.doFilter方法執行后,獲取類A中ByteArrayOutputStream流緩存數據,用GZIPOutputStream流進行壓縮下。

Filter不僅可以通過url-pattern來指定攔截哪些url匹配的資源。而且還可以通過servlet-name來指定攔截哪個指定的servlet(專門為某個servlet服務了,servlet-name對應Servlet的相關配置)。

filter-mapping標簽中dispatcher指定過濾器所攔截的資源被Servlet?容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多個<dispatcher>?子元素用來指定?Filter?對資源的多種調用方式進行攔截。

REQUEST:

當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問或ERROR情況時,那么該過濾器就不會被調用。

INCLUDE:

如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。

FORWARD:

如果目標資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾器將被調用,除此之外,該過濾器不會被調用。

ERROR:

如若在A.jsp頁面page指令中指定了error屬性=examError.jsp,那么A.jsp中若出現了異常,會跳轉到examError.jsp中處理。而在跳轉到examError.jsp時,若過濾器配置了ERROR的dispather那么則會攔截,否則不會攔截。

四、高級配置(允許代理注入spring?bean)

web.xml中配置過濾器DelegatingFilterProxy:

?

<filter><filter-name>permission</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param> </filter><filter-mapping><filter-name>permission</filter-name><url-pattern>*.htm</url-pattern> </filter-mapping>

在spring bean配置中加入:

<bean id="permission" class="你的bean"></bean>

bean的id必須和filter-name一樣。如果想不一樣,可以這樣配置:

<filter><filter-name>permission</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param><init-param><param-name>targetBeanName</param-name><param-value>test</param-value></init-param> </filter> <filter-mapping><filter-name>permission</filter-name><url-pattern>*.htm</url-pattern> </filter-mapping>

在spring bean配置中加入:

<bean id="test" class="你的bean"></bean>

以上你的spring bean必須實現Filter接口。

那這樣子做是為了什么呢?

答:這樣做就可以將DelegatingFilterProxy所代理的filter作為spring的bean,受到spring的管理,也就是通過Spring容器來管理filter的生命周期,還有就是如果filter中需要一些Spring容器的實例,可以通過spring直接注入,另外讀取一些配置文件這些便利的操作都可以通過Spring來配置實現。

其中如果設置"targetFilterLifecycle"為True,則Filter.init()和Filter.destroy()有效;若為false,則這兩個方法失效。

如果大家有用到shiro(一個強大且易用的Java安全框架,執行身份驗證、授權、密碼學和會話管理等)的話,通常就會用到這個DelegatingFilterProxy了!

?

總結

以上是生活随笔為你收集整理的java过滤器Filter的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。