一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring MVC實現的登錄攔截器代碼分享

Spring MVC實現的登錄攔截器代碼分享

2021-01-22 10:55黃小魚ZZZ Java教程

這篇文章主要介紹了Spring MVC實現的登錄攔截器代碼分享,涉及攔截器的簡單介紹,攔截器和過濾器的區以及攔截器實現代碼等相關內容,這里分享給大家,供需要的朋友參考。

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

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

定義攔截器

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

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

攔截器和過濾器的區別

       過濾器Filter依賴于Servlet容器,基于回調函數,過濾范圍大

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

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

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

實現HandlerInterceptor接口

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
    * 判斷用戶的登錄信息 ,注意此方法不能攔截,否則攔截器獲取不到session中的信息
    */
@RequestMapping("/indexManagerUser/managerLogin")
    public String userLogin(HttpServletRequest request,HttpServletResponse response,String userName,String passWord){
    logger.info("STEP INTO --> ManagerUserController.userLogin()");
    //打印出狀態
    if(userName == null || passWord == null){
        //對用戶名密碼進行判空處理
        return "manager/error/loginError";
        //返回到登錄錯誤界面
    }
    ManagerUser managerUser = managerUserService.userLogin(userName,passWord);
    //調用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";
    }
}

攔截器如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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中沒有用戶的信息,跳轉到登錄頁面,內部網頁不能訪問
      logger.info("ManagerUserInterceptor---->>>>>>preHandle");
      request.getRequestDispatcher("/index.jsp").forward(request, response);
      return false;
    }else
      return true;  
  }
    
}

攔截器完成以后,需要在配置文件中進行配置,

配置如下,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mvc:interceptors>
    <!-- 配置訪問攔截器 -->
    <mvc:interceptor>
      <mvc:mapping path="/"/><!-- 我這里邊是對方法分開進行攔截的 -->
      <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>

總結

以上就是本文關于Spring MVC實現的登錄攔截器代碼分享的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。小編會及時回復大家并進行修改。感謝朋友們對服務器之家的支持!

原文鏈接:http://blog.csdn.net/wojiaohuangyu/article/details/52125741

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲无人区乱码中文字幕 | 午夜香蕉成视频人网站高清版 | 欧美成人一区二区三区 | 亚洲www在线| 好爽好粗| 99自拍网| 四缺一小说 | 国内外成人在线视频 | 农夫69小说恋老妇小说 | 亚洲一区二区三区深夜天堂 | 成人xxxxxx| 精品人伦一区二区三区潘金莲 | 天堂在线中文字幕 | 国产高清一区二区三区免费视频 | 日本一卡二卡3卡四卡无卡网址 | 国产欧美一区二区精品久久久 | 欧美图片另类小说综合 | 日韩一本在线 | 三极片在线观看 | 国产第一福利视频导航在线 | 扒开斗罗美女了的胸罩和内裤漫画 | 国产成人一区二区三区在线视频 | 精品久久日日躁夜夜躁AV | 91porny.首页| 国产全部理论片线观看 | 国产剧情麻豆刘玥视频 | 国产一区二区在线观看视频 | 狠狠久久久久综合网 | 日本高清色视影www日本 | 国产经典一区二区三区蜜芽 | 亚洲免费高清视频 | 亚洲午夜久久久久国产 | 亚洲精品乱码蜜桃久久久 | 欧美一级乱妇老太婆特黄 | 欧美一区二区三区精品国产 | 免费看男女做好爽好硬视频 | 日本在线观看视频网站 | 国产在线视频一区二区三区 | 99久热只有精品视频免费看 | 日本不卡免免费观看 | 毛片在线网址 |