spring mvc拦截器HandlerInterceptor
本文主要介紹springmvc中的攔截器,包括攔截器定義和的配置,然后演示了一個鏈?zhǔn)綌r截的測試示例,最后通過一個登錄認(rèn)證的例子展示了攔截器的應(yīng)用
攔截定義
定義攔截器,實(shí)現(xiàn)HandlerInterceptor接口。接口中提供三個方法。
public class HandlerInterceptor1 implements HandlerInterceptor{ //進(jìn)入 Handler方法之前執(zhí)行 //用于身份認(rèn)證、身份授權(quán) //比如身份認(rèn)證,如果認(rèn)證通過表示當(dāng)前用戶沒有登陸,需要此方法攔截不再向下執(zhí)行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //return false表示攔截,不向下執(zhí)行 //return true表示放行 return false; } //進(jìn)入Handler方法之后,返回modelAndView之前執(zhí)行 //應(yīng)用場景從modelAndView出發(fā):將公用的模型數(shù)據(jù)(比如菜單導(dǎo)航)在這里傳到視圖,也可以在這里統(tǒng)一指定視圖 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } //執(zhí)行Handler完成執(zhí)行此方法 //應(yīng)用場景:統(tǒng)一異常處理,統(tǒng)一日志處理 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }可以從名稱和參數(shù)看出各個接口的順序和作用:
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
- 參數(shù)最少,只有三個
- 進(jìn)入 Handler方法之前執(zhí)行
- 用于身份認(rèn)證、身份授權(quán)。比如身份認(rèn)證,如果認(rèn)證通過表示當(dāng)前用戶沒有登陸,需要此方法攔截不再向下執(zhí)行
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
- 多了一個modelAndView參數(shù)
- 進(jìn)入Handler方法之后,返回modelAndView之前執(zhí)行
- 應(yīng)用場景從modelAndView出發(fā):將公用的模型數(shù)據(jù)(比如菜單導(dǎo)航)在這里傳到視圖,也可以在這里統(tǒng)一指定視圖
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
- 多了一個Exception的類型的參數(shù)
- 執(zhí)行Handler完成執(zhí)行此方法
- 應(yīng)用場景:統(tǒng)一異常處理,統(tǒng)一日志處理
攔截器配置
針對HandlerMapping配置
springmvc攔截器針對HandlerMapping進(jìn)行攔截設(shè)置,如果在某個HandlerMapping中配置攔截,經(jīng)過該HandlerMapping映射成功的handler最終使用該攔截器。
<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"> <list> <ref bean="handlerInterceptor1"/> <ref bean="handlerInterceptor2"/> </list> </property> </bean> <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/> <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>一般不推薦使用。
類似全局的攔截器
springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中。
<!--攔截器 --> <mvc:interceptors><!--多個攔截器,順序執(zhí)行 --><mvc:interceptor><!-- /**表示所有url包括子url路徑 --> <mvc:mapping path="/**"/> <bean class="com.iot.learnssm.firstssm.interceptor.HandlerInterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.iot.learnssm.firstssm.interceptor.HandlerInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors>攔截測試
測試多個攔截器各個方法執(zhí)行時機(jī)
訪問/items/queryItems.action
- 1.兩個攔截器都放行
總結(jié):preHandle方法按順序執(zhí)行,postHandle和afterCompletion按攔截器配置的逆向順序執(zhí)行。
2.攔截器1放行,攔截器2不放行
DEBUG [http-apr-8080-exec-8] - DispatcherServlet with name 'springmvc' processing GET request for [/ssm1/items/queryItems.action] DEBUG [http-apr-8080-exec-8] - Looking up handler method for path /items/queryItems.action DEBUG [http-apr-8080-exec-8] - Returning handler method [public org.springframework.web.servlet.ModelAndView com.iot.learnssm.firstssm.controller.ItemsController.queryItems(javax.servlet.http.HttpServletRequest,com.iot.learnssm.firstssm.po.ItemsQueryVo) throws java.lang.Exception] DEBUG [http-apr-8080-exec-8] - Returning cached instance of singleton bean 'itemsController' DEBUG [http-apr-8080-exec-8] - Last-Modified value for [/ssm1/items/queryItems.action] is: -1 HandlerInterceptor1...preHandle HandlerInterceptor2...preHandle HandlerInterceptor1...afterCompletion DEBUG [http-apr-8080-exec-8] - Successfully completed request總結(jié):
- 攔截器1放行,攔截器2 preHandle才會執(zhí)行。
- 攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執(zhí)行。
- 只要有一個攔截器不放行,postHandle不會執(zhí)行。
3.兩個攔截器都不放
DEBUG [http-apr-8080-exec-9] - DispatcherServlet with name 'springmvc' processing GET request for [/ssm1/items/queryItems.action] DEBUG [http-apr-8080-exec-9] - Looking up handler method for path /items/queryItems.action DEBUG [http-apr-8080-exec-9] - Returning handler method [public org.springframework.web.servlet.ModelAndView com.iot.learnssm.firstssm.controller.ItemsController.queryItems(javax.servlet.http.HttpServletRequest,com.iot.learnssm.firstssm.po.ItemsQueryVo) throws java.lang.Exception] DEBUG [http-apr-8080-exec-9] - Returning cached instance of singleton bean 'itemsController' DEBUG [http-apr-8080-exec-9] - Last-Modified value for [/ssm1/items/queryItems.action] is: -1 HandlerInterceptor1...preHandle DEBUG [http-apr-8080-exec-9] - Successfully completed request總結(jié):
- 攔截器1 preHandle不放行,postHandle和afterCompletion不會執(zhí)行。
- 攔截器1 preHandle不放行,攔截器2不執(zhí)行。
4.攔截器1不放行,攔截器2放行
DEBUG [http-apr-8080-exec-8] - DispatcherServlet with name 'springmvc' processing GET request for [/ssm1/items/queryItems.action] DEBUG [http-apr-8080-exec-8] - Looking up handler method for path /items/queryItems.action DEBUG [http-apr-8080-exec-8] - Returning handler method [public org.springframework.web.servlet.ModelAndView com.iot.learnssm.firstssm.controller.ItemsController.queryItems(javax.servlet.http.HttpServletRequest,com.iot.learnssm.firstssm.po.ItemsQueryVo) throws java.lang.Exception] DEBUG [http-apr-8080-exec-8] - Returning cached instance of singleton bean 'itemsController' DEBUG [http-apr-8080-exec-8] - Last-Modified value for [/ssm1/items/queryItems.action] is: -1 HandlerInterceptor1...preHandle DEBUG [http-apr-8080-exec-8] - Successfully completed request和兩個攔截器都不行的結(jié)果一致,因?yàn)閿r截器1先執(zhí)行,沒放行
- 小結(jié)
根據(jù)測試結(jié)果,對攔截器應(yīng)用。
比如:統(tǒng)一日志處理攔截器,需要該攔截器preHandle一定要放行,且將它放在攔截器鏈接中第一個位置。
比如:登陸認(rèn)證攔截器,放在攔截器鏈接中第一個位置。權(quán)限校驗(yàn)攔截器,放在登陸認(rèn)證攔截器之后。(因?yàn)榈顷懲ㄟ^后才校驗(yàn)權(quán)限,當(dāng)然登錄認(rèn)證攔截器要放在統(tǒng)一日志處理攔截器后面)
攔截器應(yīng)用(實(shí)現(xiàn)登陸認(rèn)證)
需求
- 1.用戶請求url
- 2.攔截器進(jìn)行攔截校驗(yàn)
- 如果請求的url是公開地址(無需登陸即可訪問的url),讓放行
- 如果用戶session 不存在跳轉(zhuǎn)到登陸頁面
- 如果用戶session存在放行,繼續(xù)操作。
登陸controller方法
@Controller public class LoginController { // 登陸 @RequestMapping("/login") public String login(HttpSession session, String username, String password) throws Exception { // 調(diào)用service進(jìn)行用戶身份驗(yàn)證 // ... // 在session中保存用戶身份信息 session.setAttribute("username", username); // 重定向到商品列表頁面 return "redirect:/items/queryItems.action"; } // 退出 @RequestMapping("/logout") public String logout(HttpSession session) throws Exception { // 清除session session.invalidate(); // 重定向到商品列表頁面 return "redirect:/items/queryItems.action"; } }登陸認(rèn)證攔截實(shí)現(xiàn)
- 代碼實(shí)現(xiàn)
- 攔截器配置
?轉(zhuǎn)自:http://brianway.github.io/2016/03/30/springmvc-learn-20-interceptor/
轉(zhuǎn)載于:https://www.cnblogs.com/thinkingandworkinghard/p/8124295.html
總結(jié)
以上是生活随笔為你收集整理的spring mvc拦截器HandlerInterceptor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女子晒与小17岁男友的成长轨迹爆火 一看
- 下一篇: 豪掷507亿!宁德时代出海建厂:奔驰成首