Java Spring攔截器案例詳解
springmvc提供了攔截器,類似于過濾器,他將在我們的請求具體出來之前先做檢查,有權(quán)決定接下來是否繼續(xù),對我們的請求進(jìn)行加工。
攔截器,可以設(shè)計(jì)多個(gè)。
通過實(shí)現(xiàn)handlerunterceptor,這是個(gè)接口
定義了非常重要的三個(gè)方法:
后置處理
前置處理
完成處理
案例一:
通過攔截器實(shí)現(xiàn)方法耗時(shí)統(tǒng)計(jì)與警告
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;
/**
* 方法耗時(shí)統(tǒng)計(jì)攔截器
*/
public class MethodTimerInterceptor implements HandlerInterceptor {
private static final Logger LOGGER=Logger.getLogger(MethodTimerInterceptor.class);
//前置功能, 開始到結(jié)束,兩個(gè)點(diǎn)減法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//定義開始時(shí)間
long start = System.currentTimeMillis();
//2.將其存到請求域當(dāng)中
request.setAttribute("start",start);
//記錄請求日志
LOGGER.info(request.getRequestURI()+",請求到達(dá)");
//3,返回true,才會找下一個(gè)攔截器,如果沒有下一個(gè)攔截器,則去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,記錄耗時(shí)
long spendTime = end-start;
if (spendTime>2000){
LOGGER.warn("方法耗時(shí)嚴(yán)重,請及時(shí)處理,耗時(shí):"+spendTime);
}else {
LOGGER.info("方法耗時(shí)"+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);
//檢查當(dāng)前會話是否有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("您不具備權(quán)限,請先登錄");
return false;
}
if(user instanceof User){
//再去數(shù)據(jù)庫檢查其身份對不對,是否凍結(jié)。。。
User user1 = (User) user;
user1.setPwd(null);
request.getSession().setAttribute("SESSION_USER",user1);
LOGGER.info(user1.getName()+"處于登錄狀態(tài),可以執(zhí)行操作");
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/**/*
還需要開放登錄權(quán)限
-->
<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節(jié)點(diǎn)之下即可。
攔截器執(zhí)行順序問題
如果有N個(gè)攔截器,并且都能攔截到某個(gè)URI的時(shí)候,執(zhí)行順序問題,
在springmvc當(dāng)中攔截器定義的順序是有關(guān)系的。配置在前面的優(yōu)先攔截,按照順序來
攔截器與過濾器的比較
相似
1,都有優(yōu)先處理請求的權(quán)利,都可以決定是否將請求轉(zhuǎn)移到請求的實(shí)際處理的控制器處。
2,都可以對請求或者會話當(dāng)中的數(shù)據(jù)進(jìn)行加工。
不同
1, 攔截器可以做前置處理也可以做后置處理,還可以進(jìn)行完成處理,控制的 更加細(xì)致,而過濾器只負(fù)責(zé)前面的過濾行為而已。
2, 過濾器優(yōu)先執(zhí)行,還是攔截器優(yōu)先呢?----------過濾器優(yōu)先。
3,過濾器是servlet規(guī)范里面的組件。
4, 攔截器都是框架自己而外添加的組件。
到此這篇關(guān)于Java Spring攔截器案例詳解的文章就介紹到這了,更多相關(guān)Java Spring攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)
本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
解決feign接口返回泛型設(shè)置屬性為null的問題
這篇文章主要介紹了解決feign接口返回泛型設(shè)置屬性為null的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring Boot Admin 進(jìn)行項(xiàng)目監(jiān)控管理的方法
Spring Boot Admin是一個(gè)開源社區(qū)項(xiàng)目,用于管理和監(jiān)控SpringBoot應(yīng)用程序。 這篇文章主要介紹了 Spring Boot Admin 進(jìn)行項(xiàng)目監(jiān)控管理的方法,需要的朋友可以參考下2020-07-07
Java購物系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java購物系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載操作
這篇文章主要為大家介紹了Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載的操作過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
Spring?AOP?的實(shí)現(xiàn)和切點(diǎn)表達(dá)式的實(shí)現(xiàn)方式
本文給大家介紹了Spring?AOP的基本概念、通知類型、切點(diǎn)表達(dá)式和切面優(yōu)先級,并通過示例代碼展示了如何實(shí)現(xiàn)這些功能,感興趣的朋友跟隨小編一起看看吧2024-12-12
Springboot基于websocket實(shí)現(xiàn)簡單在線聊天功能
這篇文章主要介紹了Springboot基于websocket實(shí)現(xiàn)簡單在線聊天功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Mybatis使用useGeneratedKeys獲取自增主鍵的方法
這篇文章主要給大家介紹了關(guān)于Mybatis使用useGeneratedKeys獲取自增主鍵的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

