最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享

 更新時間:2017年10月19日 09:03:19   作者:黃小魚ZZZ  
這篇文章主要介紹了Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享,涉及攔截器的簡單介紹,攔截器和過濾器的區(qū)以及攔截器實(shí)現(xiàn)代碼等相關(guān)內(nèi)容,這里分享給大家,供需要的朋友參考。

之前接觸過struts攔截器,但是沒有使用過Spring MVC攔截器,今天花了一天時間好好研究了一下。

本文首先介紹了攔截器的基本概念,然后向大家闡述攔截器與過濾器的簡要區(qū)別,通過HandlerInterceptor 接口中定義的三個方法實(shí)現(xiàn)攔截器功能,最后介紹了配置相關(guān)的代碼,接下來看看具體內(nèi)容。

定義攔截器

       SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實(shí)現(xiàn)的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實(shí)現(xiàn)了Spring 的HandlerInterceptor 接口,或者是這個類繼承實(shí)現(xiàn)了HandlerInterceptor 接口的類,比如Spring 已經(jīng)提供的實(shí)現(xiàn)了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;第二種方式是實(shí)現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實(shí)現(xiàn)了WebRequestInterceptor的類。

       攔截器的使用場景:解決亂碼問題,解決權(quán)限驗(yàn)證問題 使用原則:處理所有請求的共同遇到的問題

攔截器和過濾器的區(qū)別

       過濾器Filter依賴于Servlet容器,基于回調(diào)函數(shù),過濾范圍大

       攔截器Interceptor依賴于框架容器,基于反射機(jī)制,只過濾請求

  攔截器可以處理Web應(yīng)用中請求的一些通用性問題

  共性問題在攔截器中處理,可以減少重復(fù)代碼,便于維護(hù)

實(shí)現(xiàn)HandlerInterceptor接口

       HandlerInterceptor 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進(jìn)行攔截處理的。

     (1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顧名思義,該方法將在請求處理之前進(jìn)行調(diào)用。SpringMVC 中的Interceptor 是鏈?zhǔn)降恼{(diào)用的,在一個應(yīng)用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進(jìn)行一些判斷來決定請求是否要繼續(xù)進(jìn)行下去。該方法的返回值是布爾值Boolean 類型的,當(dāng)它返回為false 時,表示請求結(jié)束,后續(xù)的Interceptor 和Controller 都不會再執(zhí)行;當(dāng)返回值為true 時就會繼續(xù)調(diào)用下一個Interceptor 的preHandle 方法,如果已經(jīng)是最后一個Interceptor 的時候就會是調(diào)用當(dāng)前請求的Controller 方法。

     (2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion 方法都只能是在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調(diào)用。postHandle 方法,顧名思義就是在當(dāng)前請求進(jìn)行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet 進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進(jìn)行操作。postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過程有點(diǎn)類型。Struts2 里面的Interceptor 的執(zhí)行過程也是鏈?zhǔn)降?,只是在Struts2 里面需要手動調(diào)用ActionInvocation 的invoke 方法來觸發(fā)對下一個Interceptor 或者是Action 的調(diào)用,然后每一個Interceptor 中在invoke 方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke 方法之后的內(nèi)容就是反向的。

    (3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是需要當(dāng)前對應(yīng)的Interceptor 的preHandle 方法的返回值為true 時才會執(zhí)行。顧名思義,該方法將在整個請求結(jié)束之后,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行。這個方法的主要作用是用于進(jìn)行資源清理工作的。

     我試著做了一個簡單的登錄攔截,根據(jù)session中是否有信息來進(jìn)行判斷.以下是代碼,代碼很簡單,控制器中判斷用戶名密碼是否正確,然后將用戶信息保存到session中,方法如下:

/* 
    * 判斷用戶的登錄信息 ,注意此方法不能攔截,否則攔截器獲取不到session中的信息 
    */
@RequestMapping("/indexManagerUser/managerLogin") 
    public String userLogin(HttpServletRequest request,HttpServletResponse response,String userName,String passWord){
	logger.info("STEP INTO --> ManagerUserController.userLogin()");
	//打印出狀態(tài) 
	if(userName == null || passWord == null){
		//對用戶名密碼進(jìn)行判空處理 
		return "manager/error/loginError";
		//返回到登錄錯誤界面
	}
	ManagerUser managerUser = managerUserService.userLogin(userName,passWord);
	//調(diào)用service判斷用戶名密碼是否正確 
	if(managerUser != null){
		//如果用戶信息不為空,將用戶信息保存到session中 
		HttpSession session = request.getSession();
		session.setAttribute("managerUser", managerUser);
		session.setMaxInactiveInterval(1800);
		return "manager/systemSet/welcome";
	} else{
		return "manager/error/loginError";
	}
}

攔截器如下:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.log4j.Logger; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
import com.elushunfeng.model.ManagerUser; 
public class ManagerUserInterceptor extends HandlerInterceptorAdapter{ 
   private static Logger logger = Logger.getLogger(ManagerUserInterceptor.class); 
 
  @Override 
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception { 
    /* 
     * 從session中獲取用戶信息 
     */ 
    ManagerUser managerUser = (ManagerUser) request.getSession().getAttribute("managerUser"); 
    if(managerUser == null){//如果session中沒有用戶的信息,跳轉(zhuǎn)到登錄頁面,內(nèi)部網(wǎng)頁不能訪問 
      logger.info("ManagerUserInterceptor---->>>>>>preHandle"); 
      request.getRequestDispatcher("/index.jsp").forward(request, response); 
      return false; 
    }else 
      return true;   
  } 
    
} 

攔截器完成以后,需要在配置文件中進(jìn)行配置,

配置如下,

<mvc:interceptors> 
    <!-- 配置訪問攔截器 --> 
    <mvc:interceptor> 
      <mvc:mapping path="/"/><!-- 我這里邊是對方法分開進(jìn)行攔截的 --> 
      <mvc:mapping path="/payAliPay/**" /> 
      <mvc:mapping path="/logistics/**" /> 
      <mvc:mapping path="/petroleumOrder/**" /> 
      <mvc:mapping path="/petroleum/**" /> 
      <mvc:mapping path="/carousel/**" /> 
      <mvc:mapping path="/managerUser/**" /> 
      <mvc:mapping path="/user/queryCheckUsers/**" /> 
      <bean id="managerUserInterceptor" class="com.elushunfeng.manager.interceptor.ManagerUserInterceptor"/> 
    </mvc:interceptor> 
  </mvc:interceptors> 

總結(jié)

以上就是本文關(guān)于Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:SpringMVC使用MultipartFile 實(shí)現(xiàn)異步上傳方法介紹SpringMVC在啟動完成后執(zhí)行方法源碼解析等。如有不足之處,歡迎留言指出。小編會及時回復(fù)大家并進(jìn)行修改。感謝朋友們對腳本之家的支持!

相關(guān)文章

  • 詳解Java線程池如何統(tǒng)計(jì)線程空閑時間

    詳解Java線程池如何統(tǒng)計(jì)線程空閑時間

    這篇文章主要和大家分享一個面試題:Java線程池是怎么統(tǒng)計(jì)線程空閑時間?文中的示例代碼講解詳細(xì),對我們掌握J(rèn)ava有一定幫助,需要的可以參考一下
    2022-11-11
  • mybatis?plus更新字段為null處理方法

    mybatis?plus更新字段為null處理方法

    這篇文章主要為大家介紹了將mybatis?plus更新字段為null的處理方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用

    Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用

    堆是一顆完全二叉樹,在這棵樹中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆,堆雖然是一顆樹,但是通常存放在一個數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過數(shù)組下標(biāo)來確定
    2021-10-10
  • Springboot Activemq整合過程代碼圖解

    Springboot Activemq整合過程代碼圖解

    這篇文章主要介紹了Springboot Activemq整合過程代碼圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別

    Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別

    Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù),本文詳細(xì)介紹了JDBC事務(wù)與JTA分布式事務(wù),有需要的可以了解一下。
    2016-11-11
  • java代碼實(shí)現(xiàn)編譯源文件

    java代碼實(shí)現(xiàn)編譯源文件

    這篇文章主要為大家詳細(xì)介紹了Java通過?JavaCompiler?實(shí)現(xiàn)編譯源文件的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2025-01-01
  • java web服務(wù)器實(shí)現(xiàn)跨域訪問

    java web服務(wù)器實(shí)現(xiàn)跨域訪問

    這篇文章主要為大家詳細(xì)介紹了java web服務(wù)器實(shí)現(xiàn)跨域訪問,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 基于Protobuf動態(tài)解析在Java中的應(yīng)用 包含例子程序

    基于Protobuf動態(tài)解析在Java中的應(yīng)用 包含例子程序

    下面小編就為大家?guī)硪黄赑rotobuf動態(tài)解析在Java中的應(yīng)用 包含例子程序。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 討論分析JDK17是否會代替JDK8

    討論分析JDK17是否會代替JDK8

    這篇文章主要為大家介紹了JDK17是否會代替JDK8的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Spring IOC與DI核心重點(diǎn)分析

    Spring IOC與DI核心重點(diǎn)分析

    IOC也是Spring的核心之一了,之前學(xué)的時候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實(shí)現(xiàn)IOC + DI
    2022-10-10

最新評論

休宁县| 囊谦县| 买车| 衡阳县| 乳源| 龙江县| 雷山县| 宜都市| 昭觉县| 肃南| 锦州市| 宜宾市| 姚安县| 抚顺县| 宁安市| 淮安市| 吉安市| 安远县| 浮梁县| 淳安县| 栖霞市| 朝阳区| 延长县| 牟定县| 广水市| 胶州市| 安多县| 广安市| 元江| 松潘县| 安阳市| 玉环县| 白沙| 溧阳市| 古浪县| 吴川市| 嘉荫县| 马鞍山市| 平遥县| 三亚市| 张家口市|