日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 【SpringMVC學習11】SpringMVC中的攔截器

【SpringMVC學習11】SpringMVC中的攔截器

來源:程序員人生   發布時間:2016-07-26 12:49:26 閱讀次數:2864次

  Springmvc的處理器攔截器類似于Servlet 開發中的過濾器Filter,用于對處理器進行預處理和后處理。本文主要總結1下springmvc中攔截器是如何定義的,和測試攔截器的履行情況和使用方法。

1. springmvc攔截器的定義和配置

1.1 springmvc攔截器的定義

  在springmvc中,定義攔截器要實現HandlerInterceptor接口,并實現該接口中提供的3個方法,以下:

//測試攔截器1 public class HandlerInterceptor1 implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor1....preHandle"); //false表示攔截,不向下履行;true表示放行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1....postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1....afterCompletion"); } }

  針對這3個方法,我做1下簡單的分析:

  1. preHandle方法:進入Handler方法之前履行。可以用于身份認證、身份授權。比如如果認證沒有通過表示用戶沒有登陸,需要此方法攔截不再往下履行(return false),否則就放行(return true)。
  2. postHandle方法:進入Handler方法以后,返回ModelAndView之前履行。可以看到該方法中有個modelAndView的形參。利用場景:從modelAndView動身:將公用的模型數據(比如菜單導航之類的)在這里傳到視圖,也能夠在這里同1指定視圖。
  3. afterCompletion方法:履行Handler完成以后履行。利用場景:統1異常處理,統1日志處理等。

1.2 springmvc攔截器的配置

  在springmvc中,攔截器是針對具體的HandlerMapping進行配置的,也就是說如果在某個HandlerMapping中配置攔截,經過該 HandlerMapping映照成功的handler終究使用該攔截器。比如,假定我們在配置文件中配置了的映照器是org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,那末我們可以這樣來配置攔截器:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="handlerInterceptor1"/> <ref bean="handlerInterceptor2"/> </list> </property> </bean> <bean id="handlerInterceptor1" class="ssm.intercapter.HandlerInterceptor1"/> <bean id="handlerInterceptor2" class="ssm.intercapter.HandlerInterceptor2"/>

  那末在springmvc中,如何配置類似于全局的攔截器呢?上面也說了,springmvc中的攔截器是針對具體的映照器的,為了解決這個問題,springmvc框架將配置的類似全局的攔截器注入到每一個HandlerMapping中,這樣就能夠成為全局的攔截器了。配置以下:

<!-- 配置攔截器 --> <mvc:interceptors> <!-- 多個攔截器,按順序履行 --> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 表示攔截所有的url包括子url路徑 --> <bean class="ssm.interceptor.HandlerInterceptor1"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="ssm.interceptor.HandlerInterceptor2"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="ssm.interceptor.HandlerInterceptor3"/> </mvc:interceptor> </mvc:interceptors>

  1般我們都用這類配置,<mvc:mapping>中指定要攔截的url便可。

2. springmvc攔截器的履行測試

  仿照上面的HandlerInterceptor1再寫兩個攔截器,HandlerInterceptor2和HandlerInterceptor3,配置是依照上面這個配置。然后我們來測試1下3個攔截器的履行情況,并做相干總結。

2.1 3個攔截器都放行

  也就是說,我們將3個攔截器的preHandle方法中返回值都改成true,來測試1下攔截器的履行順序,測試結果以下:

HandlerInterceptor1….preHandle
HandlerInterceptor2….preHandle
HandlerInterceptor3….preHandle

HandlerInterceptor3….postHandle
HandlerInterceptor2….postHandle
HandlerInterceptor1….postHandle

HandlerInterceptor3….afterCompletion
HandlerInterceptor2….afterCompletion
HandlerInterceptor1….afterCompletion

  根據打印的結果做1個總結:當所有攔截器都放行的時候,preHandle方法是依照配置的順序執的;而另外兩個方法依照配置的順序逆向履行的。

2.2 有1個攔截器不放行

  我們將第3個攔截器的preHandle方法中返回值改成false,前兩個還是true,來測試1下攔截器的履行順序,測試結果以下:

HandlerInterceptor1….preHandle
HandlerInterceptor2….preHandle
HandlerInterceptor3….preHandle

HandlerInterceptor2….afterCompletion
HandlerInterceptor1….afterCompletion

根據打印的結果做1個總結:
  1. 由于攔截器1和2放行,所以攔截器3的preHandle才能履行。也就是說前面的攔截器放行,后面的攔截器才能履行preHandle
  2. 攔截器3不放行,所以其另外兩個方法沒有被履行。即如果某個攔截器不放行,那末它的另外兩個方法就不會背履行
  3. 只要有1個攔截器不放行,所有攔截器的postHandle方法都不會履行,但是只要履行過preHandle并且放行的,就會履行afterCompletion方法

2.3 3個攔截器都不放行

  這類情況其實可以參考上面的情況了,是1個特例,也看1下運行結果:

HandlerInterceptor1….preHandle

  很明顯,就只履行了第1個攔截器的preHandle方法,由于都不放行,所以沒有1個履行postHandle方法和afterCompletion方法。

3. 攔截器的使用

  從第2種情況來看,比如現在要寫1個統1異常處理的邏輯,那末要將該攔截器放在攔截器鏈的第1個位置,且1定要放行,由于只有放行了,才會去履行afterCompletion,而且放在攔截器鏈的第1個的話,afterCompletion方法會最后履行,才能在里面履行統1異常處理的邏輯。
  再比如,登陸認證攔截器,放在攔截器鏈接中第1個位置(如果有統1異常處理,那末應當放在統1異常處理的后面)。權限校驗攔截器,放在登陸認證攔截器以后(由于登陸通過后才校驗權限)。
  這里寫1個登陸驗證的攔截器來講明1下如何使用springmvc的攔截器。

3.1 需求

  首先看1下需求:我們要攔截啥,攔截到了要干啥。思路以下:

1、用戶要求url
2、攔截器進行攔截校驗
如果要求的url是公然地址(無需登陸便可訪問的url),讓放行。
如果用戶session不存在,則跳轉到登陸頁面。
如果用戶session存在則放行,繼續操作。

3.2 實現登陸的Controller方法

//登陸 @RequestMapping("/login") public String login(HttpServletRequest request, String username, String password) throws Exception { //實際中要去和數據庫匹配的 //.... //這里就假定登陸成功了 HttpSession session = request.getSession(); session.setAttribute("username", username); return "redirect:queryItems.action"; } //退出 @RequestMapping("/logout") public String logout(HttpServletRequest request) throws Exception { HttpSession session = request.getSession(); session.invalidate(); return "redirect:queryItems.action"; }

3.2 登陸驗證攔截器的實現

//測試攔截器1 public class LoginInterceptor implements HandlerInterceptor{ //進入Handler方法之前履行 //可以用于身份認證、身份授權。如果認證沒有通過表示用戶沒有登陸,需要此方法攔截不再往下履行,否則就放行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //獲得要求的url String url = request.getRequestURI(); //判斷url是不是公然地址(實際使用時將公然地址配置到配置文件中) //這里假定公然地址是不是登陸提交的地址 if(url.indexOf("login.action") > 0) { //如果進行登陸提交,放行 return true; } //判斷session HttpSession session = request.getSession(); //從session中取出用戶身份信息 String username = (String) session.getAttribute("username"); if(username != null) { return true; } //履行到這里表示用戶身份需要驗證,跳轉到登陸頁面 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; } //節省空間,省略另外兩個方法不寫了,也不用途理 }

然后配置該攔截器:

<!-- 配置攔截器 --> <mvc:interceptors> <!-- 多個攔截器,按順序履行 --> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 攔截所有的url包括子url路徑 --> <bean class="ssm.interceptor.LoginInterceptor"/> </mvc:interceptor> <!-- 其他攔截器 --> </mvc:interceptors>

  這樣當我們任意要求1個url的時候,就會被剛剛我們定義的攔截器給捕獲到,然后會判斷是不是session中有用戶信息,沒有的話就會跳到登陸頁面讓我們登陸:

<form action="${pageContext.request.contextPath }/login.action" method="post"> 用戶名:<input type="text" name="username" /><br> 密碼:<input type="password" name="password" /><br> <input type="submit" name="提交" /> </form>

攔截器的使用基本上就總結到這了。
  

  相干瀏覽:http://blog.csdn.net/column/details/spring-mvc.html
  學習筆記源碼下載地址:https://github.com/eson15/SpringMVC_Study


—–樂于分享,共同進步!
—–我的博客主頁:http://blog.csdn.net/eson_15

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产黄色大片网站 | 国内最真实的xxxx人伦 | 亚洲视频在线观看免费 | 欧美日韩三区 | 亚洲综合一区在线 | 日韩大片免费观看 | 精品伦精品一区二区三区视频 | 99精品九九 | 天堂在线观看 | 国产黄色a级 | 91福利国产在线观看菠萝蜜 | 81精品国产乱码久久久久久 | 国产精久 | 亚洲成人一区二区三区 | 国产精品一区自拍 | 日韩免费一区二区三区 | 欧美一区二区三区四区不卡 | 亚洲综合国产 | 91在线一区| 久久久一区二区三区 | 中文字幕不卡在线 | 亚洲成人av一区二区三区 | 四虎影院最新地址 | 久久996热在线播放 日韩精品第一区 | a级片在线免费观看 | 一级性| 99精品国产九九国产精品 | 精品久久中文字幕 | 久久一区二 | 国产精品久久久久久久久搜平片 | 国产在线日韩 | 不卡一区二区三区四区 | 日韩精品在线观看视频 | 麻豆传媒视频 | 国产欧美一区二区三区在线看 | 中文字幕在线亚洲 | 久久久99国产精品免费 | 一区二区 在线视频 | 91福利网| jizzjizz中文| 国产精品免费一区二区 |