Spring MVC實現的登錄攔截器代碼分享
之前接觸過struts攔截器,但是沒有使用過Spring MVC攔截器,今天花了一天時間好好研究了一下。
本文首先介紹了攔截器的基本概念,然后向大家闡述攔截器與過濾器的簡要區(qū)別,通過HandlerInterceptor 接口中定義的三個方法實現攔截器功能,最后介紹了配置相關的代碼,接下來看看具體內容。
定義攔截器
SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現了Spring 的HandlerInterceptor 接口,或者是這個類繼承實現了HandlerInterceptor 接口的類,比如Spring 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;第二種方式是實現Spring的WebRequestInterceptor接口,或者是繼承實現了WebRequestInterceptor的類。
攔截器的使用場景:解決亂碼問題,解決權限驗證問題 使用原則:處理所有請求的共同遇到的問題
攔截器和過濾器的區(qū)別
過濾器Filter依賴于Servlet容器,基于回調函數,過濾范圍大
攔截器Interceptor依賴于框架容器,基于反射機制,只過濾請求
攔截器可以處理Web應用中請求的一些通用性問題
共性問題在攔截器中處理,可以減少重復代碼,便于維護
實現HandlerInterceptor接口
HandlerInterceptor 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進行攔截處理的。
(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顧名思義,該方法將在請求處理之前進行調用。SpringMVC 中的Interceptor 是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調用會依據它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續(xù)進行下去。該方法的返回值是布爾值Boolean 類型的,當它返回為false 時,表示請求結束,后續(xù)的Interceptor 和Controller 都不會再執(zhí)行;當返回值為true 時就會繼續(xù)調用下一個Interceptor 的preHandle 方法,如果已經是最后一個Interceptor 的時候就會是調用當前請求的Controller 方法。
(2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion 方法都只能是在當前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調用。postHandle 方法,顧名思義就是在當前請求進行處理之后,也就是Controller 方法調用之后執(zhí)行,但是它會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進行操作。postHandle 方法被調用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過程有點類型。Struts2 里面的Interceptor 的執(zhí)行過程也是鏈式的,只是在Struts2 里面需要手動調用ActionInvocation 的invoke 方法來觸發(fā)對下一個Interceptor 或者是Action 的調用,然后每一個Interceptor 中在invoke 方法調用之前的內容都是按照聲明順序執(zhí)行的,而invoke 方法之后的內容就是反向的。
(3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是需要當前對應的Interceptor 的preHandle 方法的返回值為true 時才會執(zhí)行。顧名思義,該方法將在整個請求結束之后,也就是在DispatcherServlet 渲染了對應的視圖之后執(zhí)行。這個方法的主要作用是用于進行資源清理工作的。
我試著做了一個簡單的登錄攔截,根據session中是否有信息來進行判斷.以下是代碼,代碼很簡單,控制器中判斷用戶名密碼是否正確,然后將用戶信息保存到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){ //對用戶名密碼進行判空處理 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"; } }
攔截器如下:
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; } }
攔截器完成以后,需要在配置文件中進行配置,
配置如下,
<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實現的登錄攔截器代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:SpringMVC使用MultipartFile 實現異步上傳方法介紹、SpringMVC在啟動完成后執(zhí)行方法源碼解析等。如有不足之處,歡迎留言指出。小編會及時回復大家并進行修改。感謝朋友們對腳本之家的支持!
相關文章
java 集合之實現類ArrayList和LinkedList的方法
下面小編就為大家?guī)硪黄猨ava 集合之實現類ArrayList和LinkedList的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Java中Runnable和Callable分別什么時候使用
提到 Java 就不得不說多線程了,就算你不想說,面試官也得讓你說呀,那說到線程,就不得不說Runnable和Callable這兩個家伙了,二者在什么時候使用呢,下面就來和簡單講講2023-08-08springboot利用aop實現接口異步(進度條)的全過程
我們在開發(fā)中,調用第三方接口時,往往是提交數據,要異步去獲取數據,下面這篇文章主要給大家介紹了關于springboot利用aop實現接口異步(進度條)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-01-01