『壹』 攔截器和過濾器區別
1、過濾器和攔截器觸發時機不一樣,過濾器是在請求進入容器後,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完後,返回給前端之前。
2、攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,因為攔截器是spring提供並管理的,spring的功能可以被攔截器使用,在攔截器里注入一個service,可以調用業務邏輯。而過濾器是JavaEE標准,只需依賴servlet api ,不需要依賴spring。
過濾器攔截器運行先後步驟:
其中第2步,SpringMVC的機制是由DispaterServlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的.
3、過濾器的實現基於回調函數。而攔截器(代理模式)的實現基於反射,代理分靜態代理和動態代理,動態代理是攔截器的簡單實現。
何時使用攔截器?何時使用過濾器?
如果是非spring項目,那麼攔截器不能用,只能使用過濾器。
如果是處理controller前後,既可以使用攔截器也可以使用過濾器。
如果是處理dispaterServlet前後,只能使用過濾器。
『貳』 java web 過濾器和攔截器的區別和使用
過濾器與攔截器的區別
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
過濾器定義:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
攔截器定義:
<interceptors>
<interceptorname="testInterceptor"class="com.xxxx.TestInterceptor"/>
<interceptor-stackname="filterIPStack">
<interceptor-refname="testInterceptor"/>
</interceptor-stack>
</interceptors>
『叄』 spring攔截器和過濾器的區別
區別總結如下:
使用范圍不同 Filter 是Servlet 規定的.只能用於web 程序.而攔截器專既可以用於Web 程序,也可以用於Apllicatioon,Swing程序中屬。
規范不同:Filter是在Servlet 規范定義的,是Servlet容器支持的。而攔截器是在Spring 容器內的,Spring 框架所支持的。
使用資源不同:同其他代碼塊一樣,攔截器也是一個Spring的組件,歸Spring 管理。配置在Spring 中,因此能使用Spring 中的任何資源,對象,例如Service對象,數據源,事務管理等。通過Ioc注入到攔截器即可。而filter 則不能。
深度不同:Filter 只在Servlet前後起作用,而攔截器能深入到方法前後,異常拋出前後因而攔截器的使用具有更大的彈性,所以在spring 中優先使用攔截器。
『肆』 過濾器fiter 和攔截器 interceptor 的區別
1、filter是servlet,jsp裡面的東西,應該說是屬於規范了,而攔截器是struts的東西,不通內用。
2、一個請求,get,post等方式容,到後台,必須先經過filter,然後經過Interceptor,最後在通過在filter或者Interceptor裡面的跳轉,跳到指定的頁面或者action或者servlet中。
3、Interceptor只能攔截action請求,而filter是萬能的,是請求就能攔截。
4、filter是鏈式處理的,也就是一個filter過濾完後,如果還有過濾,那就得繼續。順序根據web.xml裡面的順序來。
5、filter是servlet包裡面的一個借口,寫一個filter,只要實現它,然後實現它的幾個方法就算一個filter了。別忘記還得再web.xml裡面配置。
『伍』 struts2過濾器和攔截器的區別
攔截器和過濾器的區別:
1、攔截器是基於java的反射機制的,而過濾器是基於函數回調
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器 :是在面向切面編程的就是在你的service或者一個方法前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
下面通過實例來看一下過濾器和攔截器的區別:
使用攔截器進行/admin 目錄下jsp頁面的過濾
[html] view plain
<package name="newsDemo" extends="struts-default"
namespace="/admin">
<interceptors>
<interceptor name="auth" class="com.test.news.util.AccessInterceptor" />
<interceptor-stack name="authStack">
<interceptor-ref name="auth" />
</interceptor-stack>
</interceptors>
<!-- action -->
<action name="newsAdminView!*" class="newsAction"
method="{1}">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authStack">
</interceptor-ref>
下面是我實現的Interceptor class:
[java] view plain
package com.test.news.util;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.test.news.action.AdminLoginAction;
/**
* @author chaoyin
*/
public class AccessInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -4291195782860785705L;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
ActionContext actionContext = actionInvocation.getInvocationContext();
Map session = actionContext.getSession();
//except login action
Object action = actionInvocation.getAction();
if (action instanceof AdminLoginAction) {
return actionInvocation.invoke();
}
//check session
if(session.get("user")==null ){
return "logout";
}
return actionInvocation.invoke();//go on
}
}
過濾器:是在javaweb中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字元集,或者去除掉一些非法字元.
使用過濾器進行/admin 目錄下jsp頁面的過濾,首先在web.xml進行過濾器配置:
[html] view plain
<filter>
<filter-name>access filter</filter-name>
<filter-class>
com.test.news.util.AccessFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>access filter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
下面是過濾的實現類:
[java] view plain
package com.test.news.util;
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;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class AccessFilter implements Filter {
/**
* @author chaoyin
*/
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
if(session.getAttribute("user")== null && request.getRequestURI().indexOf("login.jsp")==-1 ){
response.sendRedirect("login.jsp");
return ;
}
filterChain.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
『陸』 過濾器和攔截器的區別
1、filter是來servlet,jsp裡面的東西,應該說是屬於自規范了,而攔截器是struts的東西,不通用。
2、一個請求,get,post等方式,到後台,必須先經過filter,然後經過Interceptor,最後在通過在filter或者Interceptor裡面的跳轉,跳到指定的頁面或者action或者servlet中。
3、Interceptor只能攔截action請求,而filter是萬能的,是請求就能攔截。
4、filter是鏈式處理的,也就是一個filter過濾完後,如果還有過濾,那就得繼續。順序根據web.xml裡面的順序來。
5、filter是servlet包裡面的一個借口,寫一個filter,只要實現它,然後實現它的幾個方法就算一個filter了。別忘記還得再web.xml裡面配置。
『柒』 關於java ee的攔截器和過濾器的區別
過濾器與攔截器的區別
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
過濾器定義:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
攔截器定義:
<interceptors>
<interceptor name="testInterceptor" class="com.xxxx.TestInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="testInterceptor" />
</interceptor-stack>
</interceptors>
『捌』 過濾器和SpringMVC的攔截器的區別
過濾器和攔截器的區別:
①攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。
寫了點測試代碼,順便整理一下思路,搞清楚這幾者之間的順序:
1.過濾器是JavaEE標准,採用函數回調的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}
chain.doFilter(request, response);這個方法的調用作為分水嶺。事實上調用Servlet的doService()方法是在chain.doFilter(request, response);這個方法中進行的。
2.攔截器是被包裹在過濾器之中的。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之間執行。
b.preHandle()方法之後,在returnModelAndView之前進行,可以操控Controller的ModelAndView內容。
c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之間執行。
3.SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的,大致畫了個圖:其實非常好測試,自己寫一個過濾器,一個攔截器,然後在這些方法中都加個斷點,一路F8下去就得出了結論。
『玖』 JAVA過濾器和攔截器的區別有哪些
1 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次