目錄
前言
區(qū)別
聯(lián)系
前言
- 過濾器(Filter)和攔截器(Interceptor)都是用于在Web應(yīng)用程序中處理請(qǐng)求和響應(yīng)的組件,但它們?cè)趯?shí)現(xiàn)方式和功能上有一些區(qū)別。
區(qū)別
- 1. 實(shí)現(xiàn)方式:
- 過濾器是基于Servlet規(guī)范的組件,通過實(shí)現(xiàn)javax.servlet.Filter接口來定義。過濾器可以在請(qǐng)求被處理之前和響應(yīng)被發(fā)送到客戶端之前進(jìn)行操作。
- 攔截器是基于Java的反射機(jī)制,通過實(shí)現(xiàn)HandlerInterceptor接口來定義。攔截器可以在請(qǐng)求被處理之前、處理過程中和響應(yīng)被發(fā)送到客戶端之前進(jìn)行操作。????????????????
- 2. 執(zhí)行順序:??
- 過濾器在Servlet容器中的執(zhí)行順序是由部署描述符(web.xml)中的配置順序決定的,它們按照配置的順序依次執(zhí)行。
- 攔截器在Spring MVC框架中的執(zhí)行順序是由配置文件中的攔截器順序決定的,它們按照配置的順序依次執(zhí)行。
具體參照文章:登錄校驗(yàn)-Interceptor-詳解_熵240的博客-CSDN博客
- 3. 功能:
- 過濾器可以對(duì)請(qǐng)求進(jìn)行預(yù)處理和后處理,例如修改請(qǐng)求參數(shù)、編碼轉(zhuǎn)換、請(qǐng)求攔截等。過濾器可以對(duì)所有的請(qǐng)求進(jìn)行統(tǒng)一的處理。
- 攔截器可以對(duì)請(qǐng)求進(jìn)行更加細(xì)粒度的控制和處理,例如權(quán)限驗(yàn)證、日志記錄、性能監(jiān)控等。攔截器可以根據(jù)具體的請(qǐng)求路徑、請(qǐng)求方法、請(qǐng)求參數(shù)等進(jìn)行處理。
- 4. 作用范圍:
- 過濾器是在Servlet容器中工作的,可以對(duì)所有的請(qǐng)求進(jìn)行過濾處理,包括靜態(tài)資源請(qǐng)求和動(dòng)態(tài)請(qǐng)求。
- 攔截器是在Spring MVC框架中工作的,只能對(duì)控制器(Controller)處理的請(qǐng)求進(jìn)行攔截處理。
- 5. 放行條件不一樣
-過濾器(Filter)放行方式是執(zhí)行doFilter()方法實(shí)現(xiàn)的
package com.example.tlias.Filter;
import com.alibaba.fastjson.JSONObject;
import com.example.tlias.pojo.Result;
import com.example.tlias.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.io.IOException;
@Slf4j
//@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 1.獲取請(qǐng)求URL地址
String url = request.getRequestURI().toString();
log.info("獲取到的URL地址為:{}", url);
// 2.判斷URL是否含有l(wèi)ogin路徑,如果含有,則為登陸操作,放行
if (url.contains("login")) {
log.info("此請(qǐng)求為登陸操作,放行.......");
filterChain.doFilter(request, response);
return; // todo 跳出過濾器
}
// todo 以下是對(duì)于不是登錄操作的過濾
// 3.獲取請(qǐng)求頭中的令牌(token)
String token = request.getHeader("token");
// 4.判斷是否存在,如果不存在,返回錯(cuò)誤結(jié)果(未登錄)
if (!StringUtils.hasLength(token)) {
log.info("請(qǐng)求頭token為空,返回為登錄的信息");
Result error = Result.error("NOT_LOGIN"); // 返回的錯(cuò)誤信息通過接口文檔與前端統(tǒng)一
// todo 手動(dòng)轉(zhuǎn)換 將對(duì)象-->json格式數(shù)據(jù)===》可以使用阿里巴巴fastJson的工具包,在pom.xml配置文件中添加相關(guān)依賴
// todo 控制類返回的對(duì)象會(huì)自動(dòng)轉(zhuǎn)換為JSON格式的字符串?dāng)?shù)據(jù)
String noLogin = JSONObject.toJSONString(error);
// 將數(shù)據(jù)寫入響應(yīng)對(duì)象
response.getWriter().write(noLogin);
return; // todo 跳出過濾器
}
// 5.解析token,如果解析失敗,返回錯(cuò)誤結(jié)果(未登錄)
try {
JwtUtils.parseJWT(token); // todo 如果解析失敗方法就會(huì)報(bào)錯(cuò)
} catch (Exception e) { // token解析失敗
e.printStackTrace();
log.info("解析令牌失敗,返回未登錄的錯(cuò)誤信息");
Result error = Result.error("NOT_LOGIN");
String noLogin = JSONObject.toJSONString(error);
response.getWriter().write(noLogin);
return;
}
// 6.放行
log.info("令牌合法,放行");
filterChain.doFilter(request, response);
}
}
?-攔截器(Interceptor)放行的方法是在preHandle()種返回true值文章來源:http://www.zghlxwxcb.cn/news/detail-679002.html
package com.example.tlias.Interceptor;
import com.alibaba.fastjson.JSONObject;
import com.example.tlias.pojo.Result;
import com.example.tlias.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
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;
@Component // 將該類標(biāo)記為組件交給IOC容器管理
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override // todo 在目標(biāo)資源方法(控制類中的方法)執(zhí)行之前執(zhí)行,返回true:放行;返回false:不放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1.獲取請(qǐng)求URL地址
String url = request.getRequestURI().toString();
log.info("獲取到的URL地址為:{}", url);
// 2.判斷URL是否含有l(wèi)ogin路徑,如果含有,則為登陸操作,放行
if (url.contains("login")) {
log.info("此請(qǐng)求為登陸操作,放行.......");
return true; // todo 跳出攔截器
}
// todo 以下是對(duì)于不是登錄操作的過濾
// 3.獲取請(qǐng)求頭中的令牌(token)
String token = request.getHeader("token");
// 4.判斷是否存在,如果不存在,返回錯(cuò)誤結(jié)果(未登錄)
if (!StringUtils.hasLength(token)) {
log.info("請(qǐng)求頭token為空,返回為登錄的信息");
Result error = Result.error("NOT_LOGIN"); // 返回的錯(cuò)誤信息通過接口文檔與前端統(tǒng)一
// todo 手動(dòng)轉(zhuǎn)換 將對(duì)象-->json格式數(shù)據(jù)===》可以使用阿里巴巴fastJson的工具包,在pom.xml配置文件中添加相關(guān)依賴
// todo 控制類返回的對(duì)象會(huì)自動(dòng)轉(zhuǎn)換為JSON格式的字符串?dāng)?shù)據(jù)
String noLogin = JSONObject.toJSONString(error);
// 將數(shù)據(jù)寫入響應(yīng)對(duì)象
response.getWriter().write(noLogin);
return false; // todo 跳出過濾器
}
// 5.解析token,如果解析失敗,返回錯(cuò)誤結(jié)果(未登錄)
try {
JwtUtils.parseJWT(token); // todo 如果解析失敗方法就會(huì)報(bào)錯(cuò)
} catch (Exception e) { // token解析失敗
e.printStackTrace();
log.info("解析令牌失敗,返回未登錄的錯(cuò)誤信息");
Result error = Result.error("NOT_LOGIN");
String noLogin = JSONObject.toJSONString(error);
response.getWriter().write(noLogin);
return false;
}
// 6.放行
log.info("令牌合法,放行");
return true;
}
@Override // todo 在目標(biāo)資源方法執(zhí)行之后執(zhí)行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle()方法運(yùn)行了");
}
@Override // todo 在視圖渲染完畢后執(zhí)行,最后執(zhí)行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion()發(fā)運(yùn)行了");
}
}
?文章來源地址http://www.zghlxwxcb.cn/news/detail-679002.html
聯(lián)系
- 過濾器和攔截器都可以用于對(duì)請(qǐng)求進(jìn)行處理,但它們的實(shí)現(xiàn)方式和功能不同。
- 過濾器是基于Servlet規(guī)范的組件,可以對(duì)所有的請(qǐng)求進(jìn)行統(tǒng)一的處理;攔截器是基于Spring MVC框架的組件,只能對(duì)控制器處理的請(qǐng)求進(jìn)行處理。
- 過濾器和攔截器都可以用于對(duì)請(qǐng)求進(jìn)行預(yù)處理和后處理,但攔截器可以提供更加細(xì)粒度的控制和處理。
- 過濾器和攔截器都可以在請(qǐng)求被處理之前和響應(yīng)被發(fā)送到客戶端之前進(jìn)行操作,但它們的執(zhí)行順序不同。
到了這里,關(guān)于詳解過濾器Filter和攔截器Interceptor的區(qū)別和聯(lián)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!