Java Spring攔截器案例詳解
springmvc提供瞭攔截器,類似於過濾器,他將在我們的請求具體出來之前先做檢查,有權決定接下來是否繼續,對我們的請求進行加工。
攔截器,可以設計多個。
通過實現handlerunterceptor,這是個接口
定義瞭非常重要的三個方法:
後置處理
前置處理
完成處理
案例一:
通過攔截器實現方法耗時統計與警告
package com.xy.interceptors; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; /** * 方法耗時統計攔截器 */ public class MethodTimerInterceptor implements HandlerInterceptor { private static final Logger LOGGER=Logger.getLogger(MethodTimerInterceptor.class); //前置功能, 開始到結束,兩個點減法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //定義開始時間 long start = System.currentTimeMillis(); //2.將其存到請求域當中 request.setAttribute("start",start); //記錄請求日志 LOGGER.info(request.getRequestURI()+",請求到達"); //3,返回true,才會找下一個攔截器,如果沒有下一個攔截器,則去Controller return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //1,取出start long start = (long) request.getAttribute("start"); //2,得到end long end =System.currentTimeMillis(); //3,記錄耗時 long spendTime = end-start; if (spendTime>2000){ LOGGER.warn("方法耗時嚴重,請及時處理,耗時:"+spendTime); }else { LOGGER.info("方法耗時"+spendTime+"毫秒,正常"); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
springmvc的配置
<!--攔截器的配置--> <mvc:interceptors> <mvc:interceptor> <!-- --> <mvc:mapping path="/**/*"/> <bean class="com.xy.interceptors.MethodTimerInterceptor"> </bean> </mvc:interceptor> </mvc:interceptors>
案例二:會話攔截器
package com.xy.interceptors; import com.xy.pojo.User; import org.apache.log4j.Logger; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SessionInterceptor implements HandlerInterceptor { private static final Logger LOGGER=Logger.getLogger(SessionInterceptor.class); //檢查當前會話是否有User,如果有則放行,沒有則攔截 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("SESSION_USER"); if (user==null){ LOGGER.warn("您不具備權限,請先登錄"); return false; } if(user instanceof User){ //再去數據庫檢查其身份對不對,是否凍結。。。 User user1 = (User) user; user1.setPwd(null); request.getSession().setAttribute("SESSION_USER",user1); LOGGER.info(user1.getName()+"處於登錄狀態,可以執行操作"); return true; }else { LOGGER.warn("請先登錄"); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
springMvc配置
<!--攔截器的配置--> <mvc:interceptors> <!--隻想攔截/user2/**/* 還需要開放登錄權限 --> <mvc:interceptor> <mvc:mapping path="/user2/**/*"/> <!--排除登錄的URI--> <mvc:exclude-mapping path="/user2/login"></mvc:exclude-mapping> <bean class="com.xy.interceptors.SessionInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
將其配置在mvc:interceptors節點之下即可。
攔截器執行順序問題
如果有N個攔截器,並且都能攔截到某個URI的時候,執行順序問題,
在springmvc當中攔截器定義的順序是有關系的。配置在前面的優先攔截,按照順序來
攔截器與過濾器的比較
相似
1,都有優先處理請求的權利,都可以決定是否將請求轉移到請求的實際處理的控制器處。
2,都可以對請求或者會話當中的數據進行加工。
不同
1, 攔截器可以做前置處理也可以做後置處理,還可以進行完成處理,控制的 更加細致,而過濾器隻負責前面的過濾行為而已。
2, 過濾器優先執行,還是攔截器優先呢?———-過濾器優先。
3,過濾器是servlet規范裡面的組件。
4, 攔截器都是框架自己而外添加的組件。
到此這篇關於Java Spring攔截器案例詳解的文章就介紹到這瞭,更多相關Java Spring攔截器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解SpringMVC HandlerInterceptor攔截器的使用與參數
- Java設計模式之責任鏈模式
- 使用Spring的攔截器監測每個Controller或方法的執行時長
- SpringMVC攔截器超詳細解讀
- springboot過濾器和攔截器的實例代碼