springmvc中的攔截器interceptor用法


1.配置攔截器

  在springMVC.xml配置文件增加:

復制代碼
1  <mvc:interceptors>
2    <!-- 日志攔截器 -->
3    <mvc:interceptor>
4     <mvc:mapping path="/**" />
5     <mvc:exclude-mapping path="/static/**" />
6     <bean class="攔截器java代碼路徑" />
7    </mvc:interceptor>
8  </mvc:interceptors>
復制代碼

  說明:

  1)mvc:mapping 攔截器路徑配置

  2)mvc:exclude-mapping 攔截器不需要攔截的路徑

在mvc:interceptors標簽下聲明interceptor主要有兩種方式:

  • 直接定義一個Interceptor實現類的bean對象。使用這種方式聲明的Interceptor攔截器將會對所有的請求進行攔截。
  • 使用mvc:interceptor標簽進行聲明。使用這種方式進行聲明的Interceptor可以通過mvc:mapping子標簽來定義需要進行攔截的請求路徑。

  2、樣例:

復制代碼
 1 public class LogsInterceptor extends HandlerInterceptorAdapter {
 2 
 3     private static final Logger logger = LoggerFactory.getLogger(LogsInterceptor.class);
 4     
 5     private  NamedThreadLocal<String> logContext = new NamedThreadLocal<String>("log-id");
 6 
 7     @Autowired
 8     private TLogDao logDao;
 9 
10     /**
11      * preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用,
12      * SpringMVC中的Interceptor攔截器是鏈式的,可以同時存在多個Interceptor,
13      * 然后SpringMVC會根據聲明的前后順序一個接一個的執行,
14      * 而且所有的Interceptor中的preHandle方法都會在Controller方法調用之前調用。
15      * SpringMVC的這種Interceptor鏈式結構也是可以進行中斷的,
16      * 這種中斷方式是令preHandle的返回值為false,當preHandle的返回值為false的時候整個請求就結束了。
17      */
18     @Override
19     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
20         String host = request.getRemoteHost();
21         String url = request.getRequestURI();
22         TLogEntity entity = new TLogEntity();
23         entity.setCreateTime(new Timestamp(System.currentTimeMillis()));
24         entity.setCreateUser("admin");
25         entity.setIpAddress(host);
26         entity.setLogUrl(url);
27         entity.setIsSuccess("N");
28         logDao.save(entity);
29         logContext.set(entity.getLogId());
30 
31         logger.debug("IP為---->>> " + host + " <<<-----訪問了系統");
32         return true;
33     }
34 
35     /**
36      * 這個方法只會在當前這個Interceptor的preHandle方法返回值為true的時候才會執行。
37      * postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之 后, 也就是在Controller的方法調用之后執行,
38      * 但是它會在DispatcherServlet進行視圖的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操作。
39      * 這個方法的鏈式結構跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會后調用,
40      * 這跟Struts2里面的攔截器的執行過程有點像,
41      * 只是Struts2里面的intercept方法中要手動的調用ActionInvocation的invoke方法,
42      * Struts2中調用ActionInvocation的invoke方法就是調用下一個Interceptor或者是調用action,
43      * 然后要在Interceptor之前調用的內容都寫在調用invoke之前,要在Interceptor之后調用的內容都寫在調用invoke方法之后。
44      */
45     @Override
46     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
47     }
48 
49     /**
50      * 該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行。
51      * 該方法將在整個請求完成之后,也就是DispatcherServlet渲染了視圖執行, 這個方法的主要作用是用於清理資源的,
52      */
53     @Override
54     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
55         String host = request.getRemoteHost();
56         String logId = logContext.get();
57         TLogEntity entity = logDao.findOne(logId);
58         entity.setIsSuccess("Y");
59         logDao.save(entity);
60 
61         logger.debug("IP為---->>> " + host + " <<<-----訪問成功");
62     }
63 
64 }
復制代碼

  在這個攔截器中,在方法執行前可以做session或權限的。

總結:

interceptor 的執行順序大致為:

  1. 請求到達 DispatcherServlet
  2. DispatcherServlet 發送至 Interceptor ,執行 preHandle
  3. 請求達到 Controller
  4. 請求結束后,postHandle 執行
  5. 攔截器1放行,攔截器2 preHandle才會執行。

    攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。

    只要有一個攔截器不放行,postHandle不會執行。

  6. 攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。

    攔截器1 preHandle不放行,攔截器2不執行。

Spring 中主要通過 HandlerInterceptor 接口來實現請求的攔截,實現 HandlerInterceptor 接口需要實現下面三個方法:

  • preHandle() – 在handler執行之前,返回 boolean 值,true 表示繼續執行,false 為停止執行並返回。
  • postHandle() – 在handler執行之后, 可以在返回之前對返回的結果進行修改
  • afterCompletion() – 在請求完全結束后調用,可以用來統計請求耗時等等

參考鏈接

https://www.cnblogs.com/lcngu/p/7096597.html

https://www.cnblogs.com/junzi2099/p/8022058.html

https://www.cnblogs.com/moxiaotao/p/9663351.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM