日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【Spring MVC】自定义拦截器 Interceptor

發(fā)布時(shí)間:2024/2/28 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Spring MVC】自定义拦截器 Interceptor 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.自定義攔截器

1.攔截器,跟過濾器比較像的技術(shù).
1.1 攔截器和過濾器的區(qū)別:
攔截器只能攔Controller,Filter可以攔任何請(qǐng)求
因?yàn)镾pring的入口是dispatcherServlet,只有能通過Filter,才可以走攔截器
攔截器是SpringMVC的技術(shù),只有當(dāng)控制器生效時(shí),攔截器才能生效
如果直接走jsp,不走DispatcherServlet,就走不了攔截器

2.發(fā)送請(qǐng)求時(shí)被攔截器攔截,在控制器的前后添加額外功能.
2.1 跟 AOP 區(qū)分開.AOP 在特定方法前后擴(kuò)充(對(duì)ServiceImpl)
2.2 攔截器,請(qǐng)求的攔截.針對(duì)點(diǎn)是控制器方法.(對(duì)Controller)

3.SpringMVC 攔截器和Filter 的區(qū)別
3.1 攔截器只能攔截器Controller
3.2 Filter 可以攔截任何請(qǐng)求.

4.實(shí)現(xiàn)自定義攔截器的步驟:
4.1 新建類實(shí)現(xiàn)HandlerInterceptor

package cn.hanquan.interceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;public class DemoInterceptor implements HandlerInterceptor {// 在進(jìn)入控制器之前執(zhí)行// 如果返回值為false,阻止進(jìn)入控制器// 控制代碼@Overridepublic boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {// TODO Auto-generated method stubSystem.out.println("preHandle");return true;// 如果被攔截了,return false,客戶端會(huì)顯示空白頁面,也就是請(qǐng)求成功,但response為空// 從用戶交互性的角度考慮,此時(shí)應(yīng)該使用sendRedirect指定跳轉(zhuǎn)目標(biāo),給用戶一個(gè)失敗返回頁面// arg1.sendRedirect("some direction");}// 控制器執(zhí)行完成,進(jìn)入到j(luò)sp之前執(zhí)行.// 日志記錄.// 敏感詞語過濾@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {System.out.println("In postHandle, HttpServletRequest = " + arg0);System.out.println("In postHandle, HttpServletResponse = " + arg1);System.out.println("In postHandle, Object = " + arg2);System.out.println("In postHandle, ModelAndView = " + arg3);System.out.println("In postHandle, arg3.getViewName() = " + arg3.getViewName());System.out.println("arg3.getModel().get(\"model\") = " + arg3.getModel().get("model"));String word = arg3.getModel().get("model").toString();String newWord = word.replace("祖國", "**");arg3.getModel().put("model", newWord); // arg3.getModel().put("model", "修改后的內(nèi)容");System.out.println("postHandle");}// jsp執(zhí)行完成后執(zhí)行// 記錄執(zhí)行過程中出現(xiàn)的異常.// 可以把異常記錄到日志中@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {System.out.println("In afterCompletion, arg3 = " + arg3);if (arg3 != null) {System.out.println("In afterCompletion, Exception = :" + arg3.getMessage());}} }

4.2 在springmvc.xml 配置攔截器需要攔截哪些控制器
4.2.1 攔截所有控制器

<!-- 攔截器 --><mvc:interceptors><bean class="cn.hanquan.interceptor.DemoInterceptor"></bean></mvc:interceptors>

4.2.2 攔截特定的的url

<!-- 攔截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/interceptor" /><bean class="cn.hanquan.interceptor.DemoInterceptor"></bean></mvc:interceptor></mvc:interceptors>

二. 攔截器棧

  • 多個(gè)攔截器同時(shí)生效時(shí),組成了攔截器棧
  • 順序:先進(jìn)后出.
  • 執(zhí)行順序和在 springmvc.xml 中配置順序有關(guān)
  • 設(shè)置先配置攔截器A,再配置攔截器B,執(zhí)行順序?yàn)?br /> preHandle(A) --> preHandle(B) --> 控制器方法--> postHandle(B)--> postHanle(A) --> JSP --> afterCompletion(B) --> afterCompletion(A)

  • 示例效果

    目錄結(jié)構(gòu):

    總結(jié)

    以上是生活随笔為你收集整理的【Spring MVC】自定义拦截器 Interceptor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。