贛州網(wǎng)站設(shè)計(jì)重慶網(wǎng)站seo診斷
【SpringBoot中實(shí)現(xiàn)過(guò)濾器和攔截器】
1.過(guò)濾器和攔截器簡(jiǎn)述
過(guò)濾器Filter和攔截器Interceptor,在功能方面很類似,但在具體實(shí)現(xiàn)方面差距還是比較大的。
2.過(guò)濾器的配置
2.1 自定義過(guò)濾器,實(shí)現(xiàn)Filter接口(SpringBoot 3.0 開(kāi)始,jakarta.servlet.Filter,jdk需要升級(jí)到17)
2.2 重寫(xiě)doFilter,實(shí)現(xiàn)過(guò)濾邏輯,酌情放行
2.3 創(chuàng)建注解,實(shí)現(xiàn)過(guò)濾的范圍配置
3.攔截器的配置
3.1 自定義攔截器,實(shí)現(xiàn)HandlerInterceptor接口
3.2 實(shí)現(xiàn)接口中的攔截方法(preHandle-請(qǐng)求執(zhí)行前、postHandler-請(qǐng)求執(zhí)行后、aftercompletion-視圖渲染后)
3.3 創(chuàng)建配置類,實(shí)現(xiàn)WebMvcConfigurer接口,重寫(xiě)addInterceptors方法
4.總結(jié)
4.1 Filter依賴于Servlet容器,屬于Servlet規(guī)范的一部分,而Interceptor依賴于SpringMVC框架;【所依賴框架】
4.2 Filter的生命周期由servlet容器管理,而Interceptor通過(guò)IOC容器來(lái)管理,可通過(guò)注入等方式來(lái)獲取其Bean的實(shí)例;【管理的容器】
4.3 Filter可攔截所有web資源(包括]sp,Servlet,靜態(tài)資源),而Interceptor則只攔截controller。【攔截范圍】
代碼
1、過(guò)濾器:
@RestController
public class MyController {@GetMapping("/filter")public String filter() {return "filter";}
}
package com.example.demos.web.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;
/*** @date 2025/1/5 18:06* @description ip 請(qǐng)求的次數(shù)*/
@Component
//所有請(qǐng)求都會(huì)經(jīng)過(guò)這個(gè)過(guò)濾器
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;// 獲取請(qǐng)求的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count=Objects.isNull(count)?1:++count;System.out.println("ip:"+ip+" count:"+count);session.setAttribute("count", count);//放行filterChain.doFilter(servletRequest, servletResponse);}
}
結(jié)果:
2、攔截器
@RestController
public class MyController {@GetMapping("/interceptor")public String filter() {return "interceptor";}
}
進(jìn)行攔截處理
public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 獲取請(qǐng)求的ipString ip = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer) session.getAttribute("count");count= Objects.isNull(count)?1:++count;System.out.println("ip:"+ip+" count:"+count);session.setAttribute("count", count);//放行return true;}
}
配置文件需要將自定義攔截器進(jìn)行注冊(cè)
@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {MyHandlerInterceptor interceptor = new MyHandlerInterceptor();//攔截所有請(qǐng)求registry.addInterceptor(interceptor).addPathPatterns("/**");}
}
結(jié)果: