java開源代碼網(wǎng)站seo優(yōu)
文章目錄
- 🌹概念
- ?作用
- 🎄快速入門
- ?入門案例代碼實(shí)現(xiàn)
- 🛸攔截路徑
- 🍔攔截器interceptor和過濾器filter的區(qū)別
- 🎆登錄校驗(yàn)

🌹概念
攔截器(Interceptor)是一種軟件設(shè)計(jì)模式,用于在應(yīng)用程序處理請(qǐng)求或響應(yīng)時(shí)對(duì)其進(jìn)行攔截和修改。攔截器可以在整個(gè)應(yīng)用程序中使用,用于執(zhí)行跨越多個(gè)層的通用任務(wù),如身份驗(yàn)證、授權(quán)、緩存、日志記錄、性能計(jì)量等。
在Web開發(fā)中,攔截器通常用于在請(qǐng)求到達(dá)控制器之前或響應(yīng)返回客戶端之前對(duì)其進(jìn)行修改。例如,在Spring框架中,可以使用攔截器來實(shí)現(xiàn)身份驗(yàn)證和授權(quán)檢查,記錄請(qǐng)求和響應(yīng)的日志,以及處理全局異常等。
攔截器的工作方式是通過將其注冊(cè)到應(yīng)用程序的處理管道中,并在請(qǐng)求或響應(yīng)傳遞過程中執(zhí)行相應(yīng)的操作。攔截器可以訪問請(qǐng)求上下文、響應(yīng)上下文和處理程序?qū)ο?#xff0c;從而允許它們?cè)L問和修改請(qǐng)求或響應(yīng)的屬性和狀態(tài)。攔截器還可以決定是否將請(qǐng)求和響應(yīng)繼續(xù)傳遞到下一個(gè)處理程序或終止請(qǐng)求。
總之,攔截器是一種非常有用的設(shè)計(jì)模式,可以幫助開發(fā)人員在應(yīng)用程序中實(shí)現(xiàn)通用的功能,提高代碼的可重用性和可維護(hù)性。
?作用
攔截器是一種非常有用的設(shè)計(jì)模式,它可以在應(yīng)用程序處理請(qǐng)求或響應(yīng)時(shí)對(duì)其進(jìn)行攔截和修改。以下是攔截器的幾個(gè)常見用途:
- 身份驗(yàn)證和授權(quán):攔截器可以用于檢查請(qǐng)求是否具有適當(dāng)?shù)膽{據(jù),并根據(jù)需要拒絕或允許請(qǐng)求。這使得開發(fā)人員能夠輕松地實(shí)現(xiàn)身份驗(yàn)證和授權(quán)功能。
- 緩存:攔截器可以用于緩存請(qǐng)求或響應(yīng)數(shù)據(jù),以便加快應(yīng)用程序的性能。例如,在Web應(yīng)用程序中,可以使用攔截器緩存靜態(tài)資源,如CSS文件和圖像。
- 日志記錄:攔截器可以用于記錄請(qǐng)求和響應(yīng)的詳細(xì)信息,以便開發(fā)人員能夠更好地了解應(yīng)用程序的行為和性能。
- 性能計(jì)量:攔截器可以用于測(cè)量應(yīng)用程序的性能,并識(shí)別可能的瓶頸。例如,在Web應(yīng)用程序中,可以使用攔截器跟蹤頁(yè)面加載時(shí)間,并標(biāo)識(shí)慢速查詢或資源。
- 異常處理:攔截器可以用于處理應(yīng)用程序中的異常情況,并提供友好的錯(cuò)誤消息。例如,在Web應(yīng)用程序中,可以使用攔截器捕獲異常并顯示自定義錯(cuò)誤頁(yè)面。
🎄快速入門
?入門案例代碼實(shí)現(xiàn)
代碼腳手架我傳到網(wǎng)盤里面了,需要的同學(xué)請(qǐng)自取
我用夸克網(wǎng)盤分享了「tlias-web-management」,點(diǎn)擊鏈接即可保存。
鏈接:https://pan.quark.cn/s/b98922faf182
首先我們創(chuàng)建interceptor類
寫入下面的代碼
package com.itheima.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目標(biāo)資源方法運(yùn)行前運(yùn)行 返回true,放行 返回false 攔截public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}@Override //目標(biāo)方法運(yùn)行后運(yùn)行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Override //視圖渲染完畢后運(yùn)行,最后運(yùn)行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}
創(chuàng)建配置類
寫入下面的代碼
package com.itheima.config;import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration //表明這個(gè)是配置類
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//加入攔截器(加入的攔截器就是我們剛剛創(chuàng)建的攔截器)registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}
入門案例就完成了
🛸攔截路徑
通過配置攔截路徑,我們可以設(shè)置攔截什么路徑,放行什么路徑
🍔攔截器interceptor和過濾器filter的區(qū)別
接口規(guī)范不同
:過濾器需要實(shí)現(xiàn)Filter接口,而攔截器需要實(shí)現(xiàn)HanglerInterceptor接口
攔截范圍不同
:過濾器filter會(huì)攔截所有的資源,而Interceptor中會(huì)攔截Spring環(huán)境的資源
🎆登錄校驗(yàn)
登錄操作,我們需要使用LoginCheckFilter類,我們修改一下里面的代碼
下面是修改后的代碼
package com.itheima.interceptor;import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目標(biāo)資源方法運(yùn)行前運(yùn)行 返回true,放行 返回false 攔截public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {//獲取請(qǐng)求的urlString url = req.getRequestURL().toString();log.info("請(qǐng)求的url:{}",url);//判斷請(qǐng)求url中是否包含有l(wèi)ogin,如果包含,說明是登錄操作,進(jìn)行放行if(url.contains("login")){log.info("登錄操作,放行");return true;}//獲取請(qǐng)求頭的令牌(token)String jwt=req.getHeader("token");//判斷令牌是否存在,如果不存在,返回錯(cuò)誤結(jié)果(未登錄)//hasLength()方法判斷字符串是否有長(zhǎng)度(是否為空)if (!StringUtils.hasLength(jwt)){log.info("請(qǐng)求頭token為空,返回未登錄的信息");Result error= Result.error("NOT_LOGIN");//使用阿里巴巴的fastJSON工具包,將對(duì)象轉(zhuǎn)成json字符串String notLogin= JSONObject.toJSONString(error);//響應(yīng)給瀏覽器resp.getWriter().write(notLogin);return false;}//解析token,如果解析失敗,返回登錄結(jié)果//jwt令牌try {JwtUtils.parseJWT(jwt);}catch (Exception e){e.printStackTrace();log.info("解析token失敗,返回未登錄的錯(cuò)誤信息");Result error= Result.error("NOT_LOGIN");//使用阿里巴巴的fastJSON工具包,將對(duì)象轉(zhuǎn)成json字符串String notLogin= JSONObject.toJSONString(error);//響應(yīng)給瀏覽器resp.getWriter().write(notLogin);return false;}//放行log.info("令牌合法,放行");return true;}@Override //目標(biāo)方法運(yùn)行后運(yùn)行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Override //視圖渲染完畢后運(yùn)行,最后運(yùn)行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}
在技術(shù)的道路上,我們不斷探索、不斷前行,不斷面對(duì)挑戰(zhàn)、不斷突破自我。科技的發(fā)展改變著世界,而我們作為技術(shù)人員,也在這個(gè)過程中書寫著自己的篇章。讓我們攜手并進(jìn),共同努力,開創(chuàng)美好的未來!愿我們?cè)诳萍嫉恼魍旧喜粩鄪^進(jìn),創(chuàng)造出更加美好、更加智能的明天!