過濾器執行順序
① filter的使用 java 過濾器的幾種使用方法
過濾器
過濾器是處於客戶端與伺服器資源文件之間的一道過濾網,在訪問資源文件之前,通過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也可以對響應進行過濾,攔截或修改響應。
過濾器一般用於登錄許可權驗證、資源訪問許可權控制、敏感詞彙過濾、字元編碼轉換等等操作,便於代碼重用,不必每個servlet中還要進行相應的操作。
② servlet-mapping與filter-mapping 的處理順序是什麼
我可以把你的問題理解成在servlet處理過程中,普通servlet和過濾器誰先執行
答案是過濾器先執行:不管url-pattern的值一樣或者不一樣
你想想看,這里又個通俗的例子:
到網路貼吧回答問題,這就是一個普通servlet要完成的工作(提交一個問題)
可是貼吧規定:用戶未登陸不能回答問題,這就是過濾器的工作
想像以下,當我點擊提交回答的時候,肯定是先要進行用戶登陸的判斷,如果登陸了才把用戶的回答提交,未登陸就提示其先登陸
對不對?
<filter-mapping>
<filter-name>aaa</filter-name>
<url-pattern>/a/b</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>sss</servlet-name>
<url-pattern>/a/b</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>sssaa</servlet-name>
<url-pattern>/a/ba</url-pattern>
</servlet-mapping>
對於上面的配置,執行的情況是:
用戶請求"/a/b"
filter先判斷是不是要過濾這個請求:根據
<url-pattern>/a/b</url-pattern>
發現該請求要執行過濾操作,於是執行doFilter中的代碼
用戶請求"/a/ba"
filter先判斷是不是要過濾這個請求:根據
<url-pattern>/a/b</url-pattern>
發現該請求不用執行過濾操作,於是doFilter中的代碼沒又執行
③ 過濾器初始化走了,為什麼沒走dofilter
如果走chain的話,通過chain.doFilter(request,response)這個方法會立即跳轉到被攔截的servlet並且執行完還要再返回filter.chain相當於一扇門,從這扇門出去再從這扇門回來.調用filter的方法就是在web.xml中配置,需要配置一個與你需要攔截的servlet相同的url-pattern.
<!-- 配置一個過濾器 -->
<filter>
<filter-name>suibianxie</filter-name>
<filter-class>com.etoak.filter.MyEncoding</filter-class>
<!-- 配置一個私有參數 -->
<init-param>
<param-name>mycode</param-name>
<param-value>gbk</param-value>
</init-param>
</filter>
<!-- 攔截的先後順序和mapping的順序有關 -->
<filter-mapping>
<filter-name>suibianxie</filter-name>
<!-- 注意這里和要攔截的servlet的url-pattern必須一致,等於是過濾器
搶在servlet之前攔截住了 -->
<url-pattern>/servlet/Test</url-pattern>
</filter-mapping>
<!-- 配置第二個過濾器 -->
<filter>
<filter-name>suibianxie2</filter-name>
<filter-class>com.etoak.filter.Naming</filter-class>
</filter>
<filter-mapping>
<filter-name>suibianxie2</filter-name>
<url-pattern>/servlet/Test</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.etoak.servlet.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/servlet/Test</url-pattern>
</servlet-mapping>
④ 過濾器鏈中過濾器的先後順序是在哪個文件中設定的
其實沒有什麼文件規定,只是根據設備的實際情況確定的,比如在整個設備中如果沒有精確的執行機構就沒有必要安裝精確的過濾器了。
⑤ Spring filter和攔截器的區別和執行順序
Filter的執行順序跟你配置的執行順序是一樣的,執行的話要觸發到才會執行啊
當然要是過濾/*就跟配置順序一樣了
⑥ servlet 過濾器執行完chain.doFilter(req, rep);之後再去執行什麼代碼
在調用來servlet的service()方法之前,容自器會先創建一個filterchain,並把servlet傳入這個filterchain對象,作為其內部參數。創建這個filter chain的時候,會根據請求的uri,把符合條件的filter加入到這個chain里。緊接著就調用這個filter chain的doFilter方法。這個filter chain的doFilter方法就會按順序(在web.xml定義的順序)調用各個filter的doFilter方法。當所有的filter的doFilter方法都調用完以後,才會調用servlet的service方法。
⑦ Servlet 3.0 之@WebFilter怎麼控制多個filter的執行順序
之前我們控制多個的執行順序是通過web.xml中控制filter的位置來控制的,放在上面的會比放在下面的先執行,如下「用戶登錄檢查過濾器」會比「介面日誌過濾器」先執行
<!--用戶登錄檢測過濾器-->
<filter>
<filter-name>UserLoginFilter</filter-name>
<filter-class>net.tfgzs.demo.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--介面日誌過濾器-->
<filter>
<filter-name>ApiLog</filter-name>
<filter-class>net.tfgzs.demo.filter.ApiLog</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiLog</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是當我們使用@WebFilter註解的時候發現註解裡面沒有提供可以控制執行順序的參數
通過實踐發現如果想要控制filer的執行順序可以通過控制filter的文件名來控制
比如:
UserLoginFilter.java 和 ApiLog.java 這兩個文件裡面分別是「用戶登錄檢查過濾器」和「介面日誌過濾器」,因為這兩個文件的
首字母A排U之前
,導致每次執行的時候都是先執行「介面日誌過濾器」再執行「用戶登錄檢查過濾器」,所以我們現在修改兩個文件的名稱分別為
Filter0_UserLogin.java
Filter1_ApiLog.java
這樣就能先執行「用戶登錄檢查過濾器」再執行「介面日誌過濾器」
⑧ jsp關於過濾器順序的亂碼問題
首先過濾器 是有載入順序的!!!這點要明確!! 任何代碼都是從上往下執行內,怎麼可能容 隔空執行,這不符合人為規范邏輯的!
characterfilter,是字元編碼過濾器,會幫你處理字元編碼 轉義 ,
如果先載入loginfilter,你傳遞的中文參數 沒有進行任何的編碼與解碼當然為亂碼啊。
⑨ 當定義多個過濾器時,執行的順序是什麼樣的
filter和攔截器的區別復和執行順制序
1.Filter過濾器只過濾jsp文件不過濾action請求解決方案
解決辦法:在web.xml中將filter的配置放在struts2配置的前面。
2.攔截器與Filter的區別
Spring的攔截器與Servlet的Filter有相似之處,比如二者都是AOP編程思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:
使用范圍不同:Filter是Servlet規范規定的,只能用於Web程序中。而攔截器既可以用於Web程序,也可以用於Application、Swing程序中。
規范不同:Filter是在Servlet規范中定義的,是Servlet容器支持的。而攔截器是在Spring容器內的,是Spring框架支持的。
使用的資源不同:同其他的代碼塊一樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,因此能使用Spring里的任何資源、對象,例如Service對象、數據源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。
⑩ filter跟攔截器的區別和執行順序
filter和攔截器的區別和執行順序
1.Filter過濾器只過濾jsp文件不過濾action請求解決方案
解決辦法:在web.xml中將filter的配置放在struts2配置的前面。
2.攔截器與Filter的區別
Spring的攔截器與Servlet的Filter有相似之處,比如二者都是AOP編程思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:
使用范圍不同:Filter是Servlet規范規定的,只能用於Web程序中。而攔截器既可以用於Web程序,也可以用於Application、Swing程序中。
規范不同:Filter是在Servlet規范中定義的,是Servlet容器支持的。而攔截器是在Spring容器內的,是Spring框架支持的。
使用的資源不同:同其他的代碼塊一樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,因此能使用Spring里的任何資源、對象,例如Service對象、數據源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。
深度不同:Filter在只在Servlet前後起作用。而攔截器能夠深入到方法前後、異常拋出前後等,因此攔截器的使用具有更大的彈性。所以在Spring構架的程序中,要優先使用攔截器。
實際上Filter和Servlet極其相似,區別只是Filter不能直接對用戶生成響應。實際上Filter里doFilter()方法里的代碼就是從多個Servlet的service()方法里抽取的通用代碼,通過使用Filter可以實現更好的復用。
filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響 應,它只是修改對某一資源的請求,或者修改從某一的響應。
JSR中說明的是,按照多個匹配的Filter,是按照其在web.xml中配置的順序 來執行的。
所以這也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因為,它們需要在請求被Struts2框架處理之前,做一些前置的工作。
當Filter被調用,並且進入了Struts2的DispatcherFilter中 後,Struts2會按照在Action中配置的Interceptor Stack中的Interceptor的順序,來調用Interceptor。