
springMVC:攔截器
實作了HandlerInterceptor介面,
作用:用來攔截控制器的
二.定義一個攔截器
1.環境搭建
@Component
public class Demo1Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}另外要注意:除了SpringMvc,我還整理了最新JAVA架構專案實戰教程及大廠面試題庫,有興趣的可以進裙 783802103 免費獲取,沒基礎勿進哦!
2、注冊攔截器
@Configuration
@ComponentScan(basePackages={"com.czxy"})
@EnableWebMvc
public class MVCConfiguration extends WebMvcConfigurerAdapter{
/**
* 視圖決議器
* @return
*/
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
/*
* 注冊攔截器
* */
//1、定義一個成員變數,獲取攔截器物件(變數名=類名小駝峰)
@Resource
private HandlerInterceptor demo1Interceptor;
//2、重寫注冊攔截器方法,注冊攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加攔截器(注冊攔截器)
InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
//設定該攔截器的攔截路徑
i1.addPathPatterns("/**");
}
}
3.代碼實作
Demo1Interceptor:
@Component
public class Demo1Interceptor implements HandlerInterceptor {
/*
* 預處理方法:
* 執行某個控制器之前執行
* true:執行控制器方法(放行)
* false:攔截下來,不執行控制器方法(不放行、攔截)
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("demo1Interceptor-預處理方法");
return true;
}
/*
* 后處理方法:
* 某個控制器方法執行之后
* ModelAndView:用來修改控制器的跳轉路徑
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("demo1Interceptor-后處理方法");
}
/*
* 完成方法:
* 所有功能都執行完畢后,最后執行該方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("demo1Interceptor-完成方法");
}
}
4.注意事項:攔截器三大方法
- preHandle:預處理方法
是在控制器執行之前,
特殊:通過回傳值控制 控制器是否執行,
true:放行,控制器執行
false:不放行、攔截,控制器不執行
適用環境:適用于在執行控制器之前進行判斷,
- postHandle:后處理方法
前提:1、預處理方法,回傳值true
2、控制器沒有出現例外
在控制器執行之后執行,
適用環境:適用于在執行控制器之后,修改跳轉路徑/跳轉方式
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.setViewName("errorMsg");
System.out.println("demo1Interceptor-后處理方法");
}
- afterCompletion:完成后方法
前提:預處理方法,回傳值true
在所有流程執行之后執行,無論如何一定執行,相當于finally
適用環境:若未設定例外處理器,完成后方法可以進行例外處理
/*
* 完成后方法:
* 所有功能都執行完畢后,最后執行該方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("控制器出現的例外是:"+ex);
System.out.println("demo1Interceptor-完成方法");
}
5.注意事項:執行順序圖

6.注意事項:過濾器和攔截器區別

- 過濾器:
①實作了Filter介面
②用來攔截發給服務器的請求,或服務器內部的請求轉發、包含、錯誤
③過濾器在servlet之前執行
④過濾器是web組件,攔截所有WEB資源
- 攔截器:
①實作了HandlerInterceptor介面
②僅用來攔截發給 控制器的請求,或服務器內部跳轉控制器的請求轉發
③攔截器在servlet之后,控制器之前執行
④攔截器是springMVC組件,負責攔截控制器
三. 定義多個攔截器
1.代碼實作
Demo2Interceptor:
@Component
public class Demo2Interceptor implements HandlerInterceptor {
/*
* 預處理方法:
* 執行某個控制器之前執行
* true:執行控制器方法(放行)
* false:攔截下來,不執行控制器方法(不放行、攔截)
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("demo2Interceptor-預處理方法");
return true;
}
/*
* 后處理方法:
* 某個控制器方法執行之后
* ModelAndView:用來修改控制器的跳轉路徑,
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// modelAndView.setViewName("errorMsg");
System.out.println("demo2Interceptor-后處理方法");
}
/*
* 完成后方法:
* 所有功能都執行完畢后,最后執行該方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// System.out.println("控制器出現的例外是:"+ex);
System.out.println("demo2Interceptor-完成方法");
}
}
MVC配置類:
@Configuration
@ComponentScan(basePackages={"com.czxy"})
@EnableWebMvc
public class MVCConfiguration extends WebMvcConfigurerAdapter{
/**
* 視圖決議器
* @return
*/
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
/*
* 注冊攔截器
* */
//1、定義一個成員變數,獲取攔截器物件(變數名=類名小駝峰)
@Resource
private HandlerInterceptor demo1Interceptor;
@Resource
private HandlerInterceptor demo2Interceptor;
//2、重寫注冊攔截器方法,注冊攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加攔截器(注冊攔截器)
InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
//設定該攔截器的攔截路徑
i1.addPathPatterns("/**");
//添加攔截器(注冊攔截器)
InterceptorRegistration i2 = registry.addInterceptor(demo2Interceptor);
//設定該攔截器的攔截路徑
i2.addPathPatterns("/**");
}
}

2.流程圖
誰先注冊,誰先執行,

??????四.springMVC-高級-攔截器通配符設定

|
通配符 |
說明 |
|
** |
任何0~多個字符 或 任意多層目錄 例如:/user/** /user/a/b/c/run1.action /user/run1.action
|
|
* |
任何0~多個字符 例如:/user/* /user/run1.action /user/run2.action
|
|
? |
任意一個字符 例如:/user?/** /userA/run1.action /userb/run1.action /userc/run1.action |
總結:
攔截器:實作HandlerInterceptor介面,
攔截器:僅攔截控制器,
- 預處理方法:
在控制器執行之前執行,
True:放行,
False:攔截,
- 后處理方法:
在控制器正常執行之后,
前提:①預處理方法回傳true
②控制器不能拋出例外
- 完成后方法:
在流程都結束之后,
前提:預處理方法回傳true
最后注意:除了SpringMvc,我還整理了最新JAVA架構專案實戰教程及大廠面試題庫,有興趣的可以進裙 783802103 免費獲取,沒基礎勿進哦!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/186827.html
標籤:Java
