SpringMVC中的攔截器和Servlet中的過濾器效果類似,都是在Controller前面後者後面做一些事情,但是兩者也有一些區別:
- 過濾器可以應用於所有的web技術, 包括SpringMVC,但是攔截器是SpringMVC中的東西,只能用於該框架
- 過濾器可以攔截所有請求,包括靜態資源如:html,css等。攔截器不可以
攔截器的原理很簡單,通過一張圖來描述:
當請求到達後,會首先經過攔截器,攔截器會執行預處理方法,然後放行將請求發送到Controller,Controller方法執行後,會先經過攔截器的後處理方法,然後返回頁面,加載頁面完成後,還會執行攔截器頁面加載後的方法。所以,總共有三個方法,執行的位置需要搞清楚。
自定義一個攔截器首先需要寫一個類,實現HandlerInterceptor接口,實現三個上面所說的方法
public class MyInterceptor implements HandlerInterceptor {
//預處理 true表示放行,false表示不放行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("攔截器執行了...preHandle");
return true;
}
//後處理
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("攔截器執行了...postHandle");
}
//頁面加載完成處理
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("攔截器執行了...afterCompletion");
}
}
然後在配置文件中配置該攔截器
<!--配置攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean id="myInterceptor" class="test.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
最後定義 Controller方法
@Controller
@RequestMapping("/user")
public class InterceptorController {
@RequestMapping("testInterceptor")
public String testInterceptor() {
System.out.println("testInterceptor執行了");
return "success";
}
}
在頁面上編寫控制檯輸出,使得結果能明顯一點:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<%
System.out.println("success頁面執行了");
%>
</body>
</html>
執行,查看結果:
攔截器鏈的就是配置多個攔截器,配置的方法相同,只不過需要注意順序