wordpress數(shù)據(jù)庫出錯山東進(jìn)一步優(yōu)化
Spring MVC 提供了一套攔截器(Interceptor)機(jī)制,主要用于處理 Web 請求到達(dá)控制器之前或響應(yīng)離開控制器之后執(zhí)行一些操作。攔截器可以用于執(zhí)行預(yù)處理(如驗證用戶身份)和后處理(如清理資源或修改響應(yīng))。攔截器可以用來執(zhí)行一系列的任務(wù),如身份驗證、權(quán)限檢查、請求/響應(yīng)處理、日志記錄等。
1.Handler 攔截器
Handler 攔截器是 Spring MVC 中最常見的攔截器類型。 Handler 攔截器實現(xiàn) HandlerInterceptor
接口。
該接口定義了三個方法:
-
preHandle
:- 方法簽名:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
- 用途: 在控制器方法調(diào)用之前執(zhí)行。
- 返回值: 如果返回
true
,則控制器方法將被調(diào)用;如果返回false
,則控制器方法不會被調(diào)用,并且后續(xù)的攔截器也不會被調(diào)用。
- 方法簽名:
-
postHandle
:- 方法簽名:
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
- 用途: 在控制器方法調(diào)用之后執(zhí)行,但在視圖渲染之前。
- 參數(shù):
request
: 當(dāng)前請求。response
: 當(dāng)前響應(yīng)。handler
: 被調(diào)用的控制器實例。modelAndView
: 控制器方法返回的模型和視圖。
- 方法簽名:
-
afterCompletion
:- 方法簽名:
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
- 用途: 在整個請求完成后執(zhí)行,無論是否出現(xiàn)異常。
- 參數(shù):
request
: 當(dāng)前請求。response
: 當(dāng)前響應(yīng)。handler
: 被調(diào)用的控制器實例。ex
: 如果在請求處理過程中出現(xiàn)了異常,則此參數(shù)為異常對象;否則為null
。
- 方法簽名:
2.實現(xiàn)示例
下面是一個簡單的 Handler 攔截器示例:
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Pre Handle: " + request.getMethod() + " " + request.getRequestURI());return true; // 繼續(xù)處理請求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post Handle: " + request.getRequestURI());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("After Completion: " + request.getRequestURI());}
}
3.配置攔截器
要使攔截器生效,你需要將其注冊到 Spring MVC 的配置中。這可以通過 XML 配置文件或 Java 配置類來實現(xiàn)。
3.1.XML 配置示例
<mvc:interceptors><bean class="com.example.MyHandlerInterceptor" />
</mvc:interceptors>
3.2.Java 配置示例
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**") // 指定攔截器的應(yīng)用路徑.excludePathPatterns("/resources/**", "/static/**"); // 排除靜態(tài)資源}
}
4.與過濾器Filter比較
Spring MVC 中的攔截器(Interceptor)和過濾器(Filter)都是處理 Web 請求的重要機(jī)制,但它們之間存在一些關(guān)鍵的區(qū)別。下面將詳細(xì)比較這兩種機(jī)制:
1. 概念區(qū)別
-
過濾器 (Filter):
- 過濾器是 Servlet 規(guī)范的一部分,因此它適用于所有基于 Servlet 的容器,包括 Spring MVC。
- 過濾器可以在請求到達(dá)任何其他組件之前和響應(yīng)發(fā)送給客戶端之后執(zhí)行。
- 過濾器可以應(yīng)用于整個 Web 應(yīng)用程序,也可以針對特定 URL 模式。
-
攔截器 (Interceptor):
- 攔截器是 Spring MVC 特有的概念,它只能在 Spring MVC 上下文中使用。
- 攔截器主要用于處理 HTTP 請求和響應(yīng)的生命周期,但僅限于那些通過 Spring MVC DispatcherServlet 處理的請求。
- 攔截器可以針對特定的控制器方法或一組控制器方法。
2. 生命周期
-
過濾器 (Filter):
- 過濾器在整個應(yīng)用生命周期內(nèi)只初始化一次,并且每個請求/響應(yīng)都會經(jīng)過過濾器鏈。
- 過濾器可以實現(xiàn)
init()
、doFilter()
和destroy()
方法。 doFilter()
方法在每次請求時調(diào)用,而init()
和destroy()
分別在容器初始化過濾器和銷毀過濾器時調(diào)用。
-
攔截器 (Interceptor):
- 攔截器也只初始化一次,但它們僅在請求到達(dá) Spring MVC DispatcherServlet 時生效。
- 攔截器可以實現(xiàn)
preHandle()
、postHandle()
和afterCompletion()
方法。 preHandle()
在控制器方法之前調(diào)用,postHandle()
在控制器方法之后但視圖渲染之前調(diào)用,afterCompletion()
在整個請求完成后調(diào)用。
3. 配置方式
-
過濾器 (Filter):
- 過濾器可以通過部署描述符(
web.xml
文件)或 Java 配置類(通過FilterRegistrationBean
)來配置。 - 過濾器需要指定 URL 模式,以確定哪些請求應(yīng)通過該過濾器。
- 過濾器可以通過部署描述符(
-
攔截器 (Interceptor):
- 攔截器可以通過 XML 配置文件或 Java 配置類來配置。
- 攔截器可以針對特定的控制器方法或一組控制器方法,通過指定路徑模式來配置。
4. 適用場景
-
過濾器 (Filter):
- 通常用于執(zhí)行全局性的操作,如編碼轉(zhuǎn)換、登錄驗證、安全過濾等。
- 適合在請求到達(dá)任何其他組件之前執(zhí)行的操作,例如登錄檢查、安全過濾、壓縮等。
-
攔截器 (Interceptor):
- 更側(cè)重于與 Spring MVC 相關(guān)的功能,如權(quán)限檢查、數(shù)據(jù)校驗、日志記錄等。
- 適合在控制器方法之前或之后執(zhí)行的操作,例如數(shù)據(jù)預(yù)處理、視圖后處理、資源清理等。