一、過濾器和攔截器的區別
攔截器在實現上是基於Java的反射機制,屬於面向切面編程的一種運用。 可以使用Spring的依賴注入進行業務操作。一個攔截器實例在一個controller生命週期之內可以多次調用。但是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求無法攔截處理。
(1)使用範圍不同
- JavaWeb中學過的過濾器(Filter)是Java EE體系中的組件。
- 攔截器(Interceptor)是SpringMVC框架中的組件。
(2)執行時機不同
- 過濾器是運行在
所有Servlet之前
。 - 攔截器是運行在
DispatcherServlet之後
。
通常在使用Spring MVC框架後,推薦使用攔截器來實現登錄的處理。
二、演示使用攔截器
1.單個攔截器的執行順序
(1)定義一個攔截器
package com.gql.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 類說明:
* 攔截器1
* @guoqianliang1998.
*/
public class MyInterceptor1 implements HandlerInterceptor {
//在handler之前執行
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("處理器執行前...");
return true;//放行
}
//在handler返回MovelAndView後執行
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("處理器執行中...");
}
//在handler返回MovelAndView後執行 最終執行
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("處理器執行後...");
}
}
(2)配置攔截器
在SpringMVC配置中進行如下配置,其中/**表示攔截多級目錄
<!-- 自定義攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.gql.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
(3)Handler處理器
package com.gql.upload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.gql.ex.MyException;
import com.gql.pojo.User;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/add")
public String add(User user) throws MyException{
System.out.println("添加用戶成功");
return "success";
}
}
上面的測試執行後,運行順序如下,
單個攔截器的執行順序如下圖:
2.多個攔截器的執行順序
總結:
- 攔截器的
perHandle()方法
順序執行- 攔截器的
postHandle()方法
和afterCompletion方法
逆序執行。- 這裏說的順序和倒序是指SpringMVC配置文件中的攔截器的配置順序。