攔截器過濾器怎麼用
『壹』 java語言中攔截器、過濾器、監聽器都是什麼意思
過濾器,是在java web中,你傳入的,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts2的action前統一設置字元集,或者去除掉一些非法字元
攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 -
過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數
據的驗證,做一些前期的數據處理,接著把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。
監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。
好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener
介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:
做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。
『貳』 java中攔截器和過濾器的區別
1
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2
攔截器不依賴與servlet容器,過濾回器依賴與servlet容器。
3
攔截器只能答對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
『叄』 過濾器和攔截器分別有什麼作用
①攔截器是基於java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與回servlet容器答,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。
http://blog.csdn.net/chenleixing/article/details/44573495
『肆』 過濾器和攔截器的區別
1、首先要明確什麼是攔截器、什麼是過濾器
1.1 什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
1.2. 攔截器的實現原理:
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。
1.3 什麼是過濾器
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:
①以常規的方式調用資源(即,調用servlet或JSP頁面)。
②利用修改過的請求信息調用資源。
③調用資源,但在發送響應到客戶機前對其進行修改。
④阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
1.4 Servlet過濾器的基本原理
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
2、攔截器與過濾器的區別 :
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
『伍』 struts2攔截器的作用是什麼(它攔截什麼)過濾器的作用是什麼呢(過濾什麼)
攔截器只能攔截Action,說明白點攔截器其實是Action的功能塊,只在Action前後執行,初學者肯定會內有疑問,把功能全都容寫在Action中就行了呀,為什麼要把功能分出來,其實這個struts2的一個強大之處,你想想,假如這個功能塊很多Action都要用,難道你的這些Action中都要寫呀,就算復制粘貼也不方便呀,你把它做成功能塊,哪個Action需要就在哪個Action中配置就好了,更好的方法是,創建一個公共的Action,把通用的東西全配置到這裡面,其他Action引用(繼承)就可以了
過濾器是攔截用戶請求的,范圍明顯比攔截器大的多,你上網時肯定碰到過這中效果,你想下載個東西,點擊下載先跳出登陸頁面,這就是攔截器搞的鬼,沒有登錄前很多頁面或Action都被他攔截了
『陸』 filter過濾器 和攔截器的區別
1、首先要明確什麼是攔截器、什麼是過濾器
1.1 什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
1.2. 攔截器的實現原理:
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。
1.3 什麼是過濾器
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:
①以常規的方式調用資源(即,調用servlet或JSP頁面)。
②利用修改過的請求信息調用資源。
③調用資源,但在發送響應到客戶機前對其進行修改。
④阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
1.4 Servlet過濾器的基本原理
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
2、攔截器與過濾器的區別 :
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器的代碼實現(以struts2為例):
1、在xml文件中如何定義攔截器
<interceptors>
<interceptor name="filterIPInterceptor"
class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>
2、怎麼遍別寫自定義攔截器
public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日誌控制. */
private final Log log = LogFactory.getLog(getClass());
/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
String result = null;
// 獲得當前方法名.
String methodName = invocation.getInvocationContext().getName();
String currIp = null;
try
{
if (invocation.getAction() instanceof PortletAction)
{
PortletAction action = (PortletAction) invocation.getAction();
currIp = action.getRequest().getRemoteAddr();
}
String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP");
if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))
{
log.error("允許刷新的IP不存在或當前請求的IP非法.");
throw new NoAllowIPException();
}
else
{
String[] ips = ip.split(",");
boolean errorIp = true;
for (String s : ips)
{
if (s.equals(currIp))
errorIp = false;
}
// 判斷IP
if (errorIp)
throw new NoAllowIPException();
}
result = invocation.invoke();//調用被攔截的方法
}
catch (Exception e)
{
log.error("異常類名:" + invocation.getAction().getClass());
log.error("異常方法:" + methodName, e);
throw e;
}
return result;
}
}
3、怎麼編寫過濾器
1、在web.xml裡面配置自定義的攔截器
<filter>
<filter-name>Redirect Filter</filter-name>
<filter-class>com.xx.filter.RedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Redirect Filter</filter-name>
<url-pattern>/xx/xx/*</url-pattern>
</filter-mapping>
2、如何編寫自定義的攔截器
public class RedirectFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 獲取URL
Long startTime = null;
if (log.isDebugEnabled())
{
startTime = System.currentTimeMillis();
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
String url = httpRequest.getRequestURL().toString();
if (url == null || url.trim().length() == 0) {
return;
}
if (url.indexOf(luceneCreateMapping) != -1
|| url.indexOf(luceneSearchMapping) != -1) {
doFilterForxxx(request, response, url);
} else {
doxxxx(request, response, url);
}
if (log.isDebugEnabled())
{
long endTime = System.currentTimeMillis();
Thread currentThread = Thread.currentThread();
String threadName = currentThread.getName();
log.debug("[" + threadName + "]" + "< "
+ this.getClass().getName() + " " + url + " "
+ (endTime - startTime) + " ms");
}
// 激活下一個Filter
filterChain.doFilter(request, response);
}
}
『柒』 struts2 攔截器和過濾器的作用是什麼
攔截器的工作原理:
當接收到一個httprequest ,
a) 當外部的httpservletrequest到來時
b) 初始到了servlet容器 傳遞給一個標準的過濾器鏈
c) FilterDispatecher會去查找相應的ActionMapper,如果找到了相應的ActionMapper它將會將控制許可權交給ActionProxy
d) ActionProxy將會通過ConfigurationManager來查找配置struts.xml
i. 下一步將會 通過ActionInvocation來負責命令模式的實現(包括調用一些攔截Interceptor框架在調用action之前)
ii. Interceptor做一些攔截或者初始的工作
e) 一旦action返回,會查找相應的Result
f) Result類型可以是 jsp或者freeMark 等
g) 這些組件和ActionMapper一起返回給請求的url(注意攔截器的執行順序)
h) 響應的返回是通過我們在web.xml中配置的過濾器
i) 如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。
攔截器實現原理:
1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
過濾器的作用:
(1)執行Actions
過濾器通過ActionMapper對象,來判斷是否應該被映射到Action.如果mapper對象指示他應該被映射,過濾鏈將會被終止,然後Action被調用。這一點非常重要,如果同時使用SiteMesh filter,則SiteMesh filter應該放到該過濾器前,否則Action的輸出將不會被裝飾。
(2)清除ActionContext
過濾器為了確保內存溢出,會自動的清除ActionContext。這可能會存在一些問題,在和其它的框架集成時,例如SiteMesh。ActionContextCleanUp提供了怎麼處理這些問題的一些信息。
(3)維護靜態內容
過濾器也會維護在Struts2中使用的一些公共的靜態的內容,例如JavaScript文件,CSS文件等。搜索/struts/*范圍內的請求,然後將/struts/後面的值映射到一些struts的公共包中,也可以在你的類路徑中搜索。默認情況下會去查找以下包:org.apache.struts2.static.template。這樣你只用請求/struts/xhtml/styles.css,XHTML UI主題默認的樣式表將會被返回。同樣,AJAX UI組件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml中設置filter時,通過給"actionPackages"初始參數一個逗號隔開的包列表值來設定。
『捌』 什麼是攔截器,如何配置攔截器,如何使用攔截器
需在web.xml文件中配置<filter>標簽,這個標簽就是用作攔截器的,具體的配置如下:
<filter> --- 配置過濾器
<filter-name>FirstFilter</filter-name>
---為過濾器起一個名字
<filter-class>com.itheima.filter.FirstFilter</filter-class>
---過濾器類的全路徑名
<init-param>
--- 可選的 可以配置多個 過濾器的初始化參數可以在過濾器中通過FilterConfig對象來獲取
<param-name>name1</param-name>
<param-value>value1</param-value>
</init-param>
</filter>
<filter-mapping>
--- 配置過濾器的攔截路徑 ,一個<Filter>可以配置多個<filter-mappint>
<filter-name>FirstFilter</filter-name>
---為哪個過濾器進行配置
<url-pattern>/*</url-pattern>
--- 攔截哪個路徑 其中url-pattern的寫法和學習Serlvet時的url-pattern的寫法相同 這個url-pattern可以配置多個
<servlet-name>Demo1Servlet</servlet-name>
---攔截哪個名字的Servlet 可以配置多個
<dispatcher>REQUEST</dispatcher>
--- 配置攔截哪種類型的對資源的訪問,可選的值有REQUESTFORWARD INCLUDE ERROR,如果不配置默認只攔截REQUEST方式,如果具體配置了就攔截具體配置的方式的對資源的訪問,此標簽可以配置多個
</filter-mapping>
簡單點說就是需要配置<filter>和<filter-mapper>標簽,filter標簽里<filter-name>、<filter-class>是必須要的,filtermapper中<filter-name>、<url-pattern>是必須要的,其他標簽都是可選的
『玖』 JAVA攔截器與過濾器的作用,請詳細說下
Filter基於回調函數,我們需要實現的filter介面中doFilter方法就是回調函數,而interceptor則基於內java本身的反容射機制,這是兩者最本質的區別。
Filter是依賴於servlet容器的,即只能在servlet容器中執行,很顯然沒有servlet容器就無法來回調doFilter方法。而interceptor與servlet容器無關。
Filter的過濾范圍比Interceptor大,Filter除了過濾請求外通過通配符可以保護頁面,圖片,文件等等,而Interceptor只能過濾請求。
Filter的過濾例外一般是在載入的時候在init方法聲明,而Interceptor可以通過在xml聲明是guest請求還是user請求來辨別是否過濾
『拾』 java中攔截器 過濾器 監聽器都有什麼區別尤其是攔截器和過濾器
過濾器,是在java web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts2的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts2的action前統一設置字元集,或者去除掉一些非法字元
攔截器,是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
攔截器與過濾器的區別 :
攔截器是基於java的反射機制的,而過濾器是基於函數回調。
攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截後 -
過濾後。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過後,攔截器將檢查用戶提交數
據的驗證,做一些前期的數據處理,接著把處理後的數據發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程,再向上返回到過濾器的後續操作。
監聽器:這個東西在c/s模式裡面經常用到,他會對特定的事件產生產生一個處理。監聽在很多模式下用到。比如說觀察者模式,就是一個監聽來的。又比如struts2可以用監聽來啟動。Servlet監聽器用於監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生後可以做一些必要的處理。
好比如果說Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener
介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:
做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。