3小時網(wǎng)站建設(shè)平臺seo診斷優(yōu)化方案
??????
Github主頁👉https://github.com/A-BigTree
筆記鏈接👉https://github.com/A-BigTree/Code_Learning
??????
如果可以,麻煩各位看官順手點個star~😊
如果文章對你有所幫助,可以點贊👍收藏?支持一下博主~😆
文章目錄
- 6 SpringMVC攔截器
- 6.1 概念
- 攔截器VS過濾器
- 相似點
- 不同點
- 選擇
- 6.2 使用
- 6.2.1 創(chuàng)建攔截器類
- 實現(xiàn)接口
- 6.2.2 注冊攔截器
- 默認攔截全部請求
- 配置攔截路徑
- 配置不攔截路徑
- 6.2.3 執(zhí)行順序
6 SpringMVC攔截器
6.1 概念
攔截器VS過濾器
相似點
三要素相同
- 攔截:必須先把請求攔住,才能執(zhí)行后續(xù)操作;
- 過濾:攔截器或過濾器存在的意義就是對請求進行統(tǒng)一處理;
- 放行:對請求執(zhí)行了必要操作后,放請求過去,讓它訪問原本想要訪問的資源;
不同點
- 工作平臺不同
- 過濾器工作在 Servlet 容器中
- 攔截器工作在 SpringMVC 的基礎(chǔ)上
- 攔截的范圍
- 過濾器:能夠攔截到的最大范圍是整個 Web 應(yīng)用
- 攔截器:能夠攔截到的最大范圍是整個 SpringMVC 負責的請求
- IOC 容器支持
- 過濾器:想得到 IOC 容器需要調(diào)用專門的工具方法,是間接的
- 攔截器:它自己就在 IOC 容器中,所以可以直接從 IOC 容器中裝配組件,也就是可以直接得到 IOC 容器的支持
選擇
功能需要如果用 SpringMVC 的攔截器能夠?qū)崿F(xiàn),就不使用過濾器。
6.2 使用
6.2.1 創(chuàng)建攔截器類
實現(xiàn)接口
public class Process01Interceptor implements HandlerInterceptor {Logger logger = LoggerFactory.getLogger(this.getClass());// 在處理請求的目標 handler 方法前執(zhí)行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.debug("Process01Interceptor preHandle方法");// 返回true:放行// 返回false:不放行return true;}// 在目標 handler 方法之后,渲染視圖之前@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.debug("Process01Interceptor postHandle方法");}// 渲染視圖之后執(zhí)行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {logger.debug("Process01Interceptor afterCompletion方法");}
}
單個攔截器執(zhí)行順序:
preHandle()
方法- 目標handler方法
postHandle()
方法- 渲染視圖
afterCompletion()
方法
在較低版本的 SpringMVC 中,實現(xiàn)HandlerInterceptor
接口需要把所有抽象方法都實現(xiàn)。但是又不是每個方法都需要使用,導(dǎo)致代碼比較繁瑣。
此時可以通過繼承HandlerInterceptorAdapter
類同樣可以創(chuàng)建攔截器類。HandlerInterceptorAdapter
類中已經(jīng)給 HandlerInterceptor
接口提供了默認實現(xiàn),我們繼承后不需要把每個方法都實現(xiàn),只需要把有用的方法重寫即可。
在 SpringMVC 較高版本(例如:5.3版本以上)中,HandlerInterceptor
接口已經(jīng)借助JDK1.8新特性讓每個抽象方法都給出了默認實現(xiàn),所以HandlerInterceptorAdapter
這個類被標記為過時。
6.2.2 注冊攔截器
默認攔截全部請求
<!-- 注冊攔截器 -->
<mvc:interceptors><!-- 直接通過內(nèi)部 bean 配置的攔截器默認攔截全部請求(SpringMVC 范圍內(nèi)) --><bean class="com.atguigu.mvc.interceptor.Process01Interceptor"/>
</mvc:interceptors>
配置攔截路徑
精確匹配:
<!-- 具體配置攔截器可以指定攔截的請求地址 -->
<mvc:interceptor><!-- 精確匹配 --><mvc:mapping path="/common/request/one"/><bean class="com.atguigu.mvc.interceptor.Process03Interceptor"/>
</mvc:interceptor>
匹配單層路徑:
<mvc:interceptor><!-- /*匹配路徑中的一層 --><mvc:mapping path="/common/request/*"/><bean class="com.atguigu.mvc.interceptor.Process04Interceptor"/>
</mvc:interceptor>
匹配多層路徑:
<mvc:interceptor><!-- /**匹配路徑中的多層 --><mvc:mapping path="/common/request/**"/><bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>
配置不攔截路徑
<mvc:interceptor><!-- /**匹配路徑中的多層 --><mvc:mapping path="/common/request/**"/><!-- 使用 mvc:exclude-mapping 標簽配置不攔截的地址 --><mvc:exclude-mapping path="/common/request/two/bbb"/><bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>
6.2.3 執(zhí)行順序
preHandle()
方法:SpringMVC 會把所有攔截器收集到一起,然后按照配置順序調(diào)用各個preHandle()
方法;- 目標 handler 方法;
postHandle()
方法:SpringMVC會把所有攔截器收集到一起,然后按照配置相反的順序調(diào)用各個postHandle()
方法;- 渲染視圖;
afterCompletion()
方法:SpringMVC 會把所有攔截器收集到一起,然后按照配置相反的順序調(diào)用各個afterCompletion()
方法;