1. 攔截器的概述
- SpringMVC架構中的攔截器用于對處理器進行預處理和後處理的技術。
- 可以定義攔截器鍊,連接配接器鍊就是将攔截器按着一定的順序結成一條鍊,在通路被攔截的方法時,攔截器鍊中的攔截器會按着定義的順序執行。
- 攔截器和過濾器的功能比較類似,有差別
- 過濾器是Servlet規範的一部分,任何架構都可以使用過濾器技術。
- 攔截器是SpringMVC架構獨有的。
- 過濾器配置了/*,可以攔截任何資源。
- 攔截器隻會對控制器中的方法進行攔截。
- 攔截器也是AOP思想的一種實作方式
- 想要自定義攔截器,需要實作HandlerInterceptor接口。
2. 自定義攔截器步驟
controller中的方法
* 測試攔截器
*/
@Controller
@RequestMapping("/dept")
public class DeptController {
/**
* 測試方法
* @return
*/
@RequestMapping("/findAll.do")
public String findAll(){
System.out.println("controller方法執行了...");
return "suc";
}
}
建立類,實作HandlerInterceptor接口,重寫需要的方法
* 攔截器類
*/
public class MyInterceptor2 implements HandlerInterceptor{
/**
* 攔截controller中方法。放行了,執行controller中方法。
* return true 方向
* return false 攔截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("攔截器preHandle方法執行了...");
// 手動跳轉頁面
// request.getRequestDispatcher("/index.jsp").forward(request,response);
// 攔截,不放行
//return false;
// 放行
return true;
}
}
在springmvc.xml中配置攔截器類
<!--配置攔截器們-->
<mvc:interceptors>
<!--配置攔截器-->
<mvc:interceptor>
<!--該攔截器攔截哪些資源-->
<mvc:mapping path="/dept/**"/>
<!--哪些資源不想攔截
<mvc:exclude-mapping path="" />
-->
<!--攔截器對象-->
<bean class="cn.tx.demo4.MyInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
3. HandlerInterceptor接口中的方法
- preHandle方法是controller方法執行前攔截的方法
- 可以使用request或者response跳轉到指定的頁面
- return true放行,執行下一個攔截器,如果沒有攔截器,執行controller中的方法。
- return false不放行,不會執行controller中的方法。
- postHandle是controller方法執行後執行的方法,在JSP視圖執行前。
- 可以使用request或者response跳轉到指定的頁面
- 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面将不會顯示。
- postHandle方法是在JSP執行後執行
- request或者response不能再跳轉頁面了
* 攔截器類
*/
public class MyInterceptor2 implements HandlerInterceptor{
/**
* 攔截controller中方法。放行了,執行controller中方法。
* return true 方向
* return false 攔截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("攔截器preHandle方法執行了...");
// 手動跳轉頁面
// request.getRequestDispatcher("/index.jsp").forward(request,response);
// 攔截,不放行
//return false;
// 放行
return true;
}
/**
* controller方法執行後,要攔截的方法
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法執行了...");
// 也是可以進行頁面的跳轉
request.getRequestDispatcher("/index.jsp").forward(request,response);
return;
}
/**
* controller跳轉的jsp頁面都執行完成了,最後執行該方法
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法執行了...");
}
}
3. 配置多個攔截器
再編寫一個攔截器的類
* 攔截器類
*/
public class MyInterceptor3 implements HandlerInterceptor{
/**
* 攔截controller中方法。放行了,執行controller中方法。
* return true 方向
* return false 攔截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor3的preHandle方法執行了...");
// 放行
return true;
}
/**
* controller方法執行後,要攔截的方法
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor3的postHandle方法執行了...");
}
/**
* controller跳轉的jsp頁面都執行完成了,最後執行該方法
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor3的afterCompletion方法執行了...");
}
}
配置2個攔截器
<!--配置攔截器們-->
<mvc:interceptors>
<!--配置攔截器-->
<mvc:interceptor>
<!--該攔截器攔截哪些資源-->
<mvc:mapping path="/dept/**"/>
<!--哪些資源不想攔截
<mvc:exclude-mapping path="" />
-->
<!--攔截器對象-->
<bean class="cn.tx.demo4.MyInterceptor2" />
</mvc:interceptor>
<!--配置攔截器-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.tx.demo4.MyInterceptor3" />
</mvc:interceptor>
</mvc:interceptors>