這篇學習筆記是Spring系列筆記的第8篇,該筆記是筆者在學習黑馬程序員SSM框架教程課程期間的筆記,供自己和他人參考。
Spring學習筆記目錄
筆記1:【SSM】Spring基礎: IoC配置學習筆記-CSDN博客?對應黑馬課程P1~P20的內容。
筆記2: 【SSM】Spring學習筆記2:注解配置bean_ssm黑馬筆記-CSDN博客?對應黑馬課程P21~P27
筆記3:?【SSM】Spring學習筆記3:Spring整合MyBatis和Junit_spring整合mybaits-CSDN博客 對應黑馬課程P28~30
筆記4:【SSM】Spring學習筆記4:Spring的AOP編程-CSDN博客?對應黑馬課程P31~39
筆記5:【SSM】Spring學習筆記5:Spring事務-CSDN博客?對應黑馬課程P40~42
筆記6: 【SSM】SpringMVC學習筆記6:SpringMVC入門-CSDN博客?對應黑馬課程P43~58
筆記7: 【SSM】SpringMVC學習筆記7:前后端數據傳輸協議和異常處理-CSDN博客?對應黑馬課程P59~65
筆記8:此篇?對應黑馬課程P71~74
筆記9:【SSM】SpringBoot學習筆記1:SpringBoot快速入門-CSDN博客?對應黑馬課程P90~101
1.是什么
SpringMVC提供的技術,用于在controller前后執行一些操作,包括可以在controller前攔截操作使程序不執行controller的功能。
2. 快速入門
2.1 聲明攔截器的bean
這個類需要實現HandlerInterceptor接口。
該接口有三個方法可以重寫,但不是必需要重寫。
其中preHandle方法實在controller執行前執行的方法,如果該方法返回true,會放行訪問controller;否則將不會訪問controller,起到一個攔截的效果。
@Component
//定義攔截器類,實現HandlerInterceptor接口
//注意當前類必須受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override//原始方法調用前執行的內容//返回值類型可以攔截控制的執行,true放行,false終止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String contentType = request.getHeader("Content-Type");HandlerMethod hm = (HandlerMethod)handler;System.out.println("preHandle..."+contentType);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...");}
}
2.2 定義配置類
在該配置類中進行攔截器配置,配置在哪些controller上使用哪些攔截器。
需要繼承WebMvcConfigurationSupport(筆記6中對靜態界面的放行也是通過這個類來配置),實現addInterceptors方法。自己定義好的攔截器需要注入。
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//配置攔截器// “/books/*”里使用“*”通配符registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");}
}
該配置類需要被SpringMVC的核心配置類(用于初始化SpringMVC容器的類)掃描到(通過@ComponentScan注解)
@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {}
2.3 執行流程
3. 攔截器的參數
如下圖攔截器的這些參數使可以使用的。
【豆包】
1.?
HttpServletRequest request
- 作用:封裝客戶端的 HTTP 請求信息,如請求參數、請求頭、Cookies 等。
- 常用方法:
request.getParameter("name")
:獲取請求參數。request.getHeader("User-Agent")
:獲取請求頭。request.getSession()
:獲取用戶會話。- 使用場景:在
postHandle
中,可以讀取請求信息用于日志記錄或權限驗證。2.?
HttpServletResponse response
- 作用:封裝服務器的 HTTP 響應信息,可用于設置響應頭、狀態碼或直接輸出內容。
- 常用方法:
response.setStatus(200)
:設置 HTTP 狀態碼。response.setContentType("application/json")
:設置響應類型。response.getWriter().write("Custom Response")
:直接輸出內容。- 使用場景:在
postHandle
中,可以修改響應頭(如添加 CORS 信息)或提前終止響應。3.?
Object handler(樹樹:涉及反射機制)
- 作用:當前請求執行的處理器對象。在 Spring MVC 中,通常是一個
HandlerMethod
(即 Controller 中的方法)。- 常用操作:
- 判斷處理器類型:
if (handler instanceof HandlerMethod)
- 獲取方法信息:
HandlerMethod handlerMethod = (HandlerMethod) handler;
- 獲取方法注解:
handlerMethod.getMethod().getAnnotation(MyAnnotation.class)
- 使用場景:根據不同的處理器或方法注解執行不同的邏輯(如僅對特定接口進行攔截)。
4.?
ModelAndView modelAndView
- 作用:封裝處理器返回的模型數據和視圖信息(僅當處理器返回
ModelAndView
時有效)。- 常用操作:
- 修改模型數據:
modelAndView.addObject("key", "value");
- 更改視圖:
modelAndView.setViewName("newView");
- 判斷是否有視圖:
if (modelAndView != null)
- 使用場景:在響應返回前,動態添加額外數據(如全局變量)或修改視圖路徑。
5.Exception ex
?參數的作用
- 作用:封裝處理器(Controller 方法)執行過程中拋出的未被捕獲的異常。
- 注意事項:
- 僅當請求處理過程中發生異常時,
ex
?才不為?null
。- 如果請求正常完成(無異常),
ex
?為?null
。
4. 攔截器鏈
對同一個controller配置多個攔截器就會形成攔截器鏈
如下面對訪問/books、/books/的控制器添加兩個攔截器,將會以以下順序執行
- projectInterceptor.preHandle
- ->projectInterceptor2.preHandle
- ->projectInterceptor2.postHandle
- ->projectInterceptor.postHandle
- ->projectInterceptor2.afterCompletion
- ->projectInterceptor.afterCompletion
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//實現WebMvcConfigurer接口可以簡化開發,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate ProjectInterceptor projectInterceptor;@Autowiredprivate ProjectInterceptor2 projectInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//配置多攔截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");}
}