一、簡介
通過兩幅圖我們可以理解攔截器和過濾器的特點
1、過濾器
過濾器是在請求進入tomcat容器后,但請求進入servlet之前進行預(yù)處理的。請求結(jié)束返回也是,是在servlet處理完后,返回給前端之前。
理解上面這句話我們就可以知道,進入servlet之前,主要是兩個參數(shù):ServletRequest,ServletResponse 那我們得到這兩個測試可以干哪些事呢?
我們可以通過ServletRequest得到HttpServletRequest,此時你就可以對請求或響應(yīng)(Request、Response)那就可以對對web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進行攔截,從而實現(xiàn)一些特殊的功能。例如實現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息、字符集統(tǒng)一等一些高級功能。它主要用于對用戶請求進行預(yù)處理,也可以對HttpServletResponse進行后處理。使用Filter的完整流程:Filter對用戶請求進行預(yù)處理,接著將請求交給Servlet進行處理并生成響應(yīng),最后Filter再對服務(wù)器響應(yīng)進行后處理。。它是隨你的web應(yīng)用啟動而啟動的,只初始化一次,以后就可以攔截相關(guān)請求,只有當(dāng)你的web應(yīng)用停止或重新部署的時候才銷毀。(每次熱部署后,都會銷毀)。
2、攔截器
從上圖我們可以看出過濾器只在servlet前后起作用,所以它既不能捕獲異常,獲得bean對象等,這些是只能是進入servlet里面的攔截器能過做到。攔截器中用于在某個方法或字段被訪問之前,進行攔截然后,在之前或之后加入某些操作。比如日志,安全等。一般攔截器方法都是通過動態(tài)代理的方式實現(xiàn)??梢酝ㄟ^它來進行權(quán)限驗證,或者判斷用戶是否登陸,或者是像12306 判斷當(dāng)前時間是否是購票時間。
對比一下其實我們可以發(fā)現(xiàn),過濾器能做的事攔截器都能做,二攔截器做的事過濾器不一定做的了。
3、監(jiān)聽器
listener是servlet規(guī)范中定義的一種特殊類。用于監(jiān)聽servletContext、HttpSession和servletRequest等域?qū)ο蟮膭?chuàng)建和銷毀事件。監(jiān)聽域?qū)ο蟮膶傩园l(fā)生修改的事件。用于在事件發(fā)生前、發(fā)生后做一些必要的處理。其主要可用于以下方面:
- 1、統(tǒng)計在線人數(shù)和在線用戶
- 2、系統(tǒng)啟動時加載初始化信息
- 3、統(tǒng)計網(wǎng)站訪問量
- 4、記錄用戶訪問路徑。
常用的監(jiān)聽器 servletContextListener、httpSessionListener、servletRequestListener)
二、如何創(chuàng)建
1、過濾器
自定義Filter 使用Servlet3.0的注解進行配置第三步的@WebFilter就是3.0的注解
1)啟動類里面增加 @ServletComponentScan,進行掃描
2)新建一個Filter類,implements Filter,并實現(xiàn)對應(yīng)的接口
3)@WebFilter 標(biāo)記一個類為filter,被spring進行掃描
urlPatterns:攔截規(guī)則,支持正則
4)控制chain.doFilter的方法的調(diào)用,來實現(xiàn)是否通過放行不放行,web應(yīng)用resp.sendRedirect("/index.html");場景:權(quán)限控制、用戶登錄(非前端后端分離場景)等
application類
@SpringBootApplication
@ServletComponentScan
public class SpringbootstudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootstudyApplication.class, args);
}
}
LoginFilter過濾器
//過濾器攔截路徑
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter implements Filter{
/**
* 容器加載的時候調(diào)用
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("攔截器進入========攔截器進入========");
}
/**
* 請求被攔截的時候進行調(diào)用
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("攔截中========攔截中========");
HttpServletRequest hrequest = (HttpServletRequest)servletRequest;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
if(hrequest.getRequestURI().indexOf("/index") != -1 ||
hrequest.getRequestURI().indexOf("/asd") != -1 ||
hrequest.getRequestURI().indexOf("/online") != -1 ||
hrequest.getRequestURI().indexOf("/login") != -1
) {
filterChain.doFilter(servletRequest, servletResponse);
}else {
wrapper.sendRedirect("/login");
}
}
/**
* 容器被銷毀的時候被調(diào)用
*/
@Override
public void destroy() {
System.out.println("攔截器銷毀========攔截器銷毀========");
}
}
1、官網(wǎng)地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners
2、監(jiān)聽器
@WebListener
public class RequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("======銷毀監(jiān)聽器========");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("======進入監(jiān)聽器========");
}
3、攔截器
CustomWebMvcConfigurer主攔截器需要:
1:添加@Configuration注解
2:實現(xiàn)WebMvcConfigurer接口
//主攔截器,根據(jù)攔截不同路徑跳轉(zhuǎn)不同自定義攔截器 (實現(xiàn)WebMvcConfigurer方法)
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api1/*/**");
registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
//.excludePathPatterns("/api2/xxx/**"); //攔截全部 /*/*/**
WebMvcConfigurer.super.addInterceptors(registry);
}
}
LoginIntercepter子攔截器
public class LoginIntercepter implements HandlerInterceptor{
/**
* 進入controller方法之前
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginIntercepter------->preHandle");
// String token = request.getParameter("access_token");
//
// response.getWriter().print("fail");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* 調(diào)用完controller之后,視圖渲染之前
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("LoginIntercepter------->postHandle");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 整個完成之后,通常用于資源清理
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("LoginIntercepter------->afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
TwoIntercepter同上
三、總結(jié)
最后總解一下他們:
過濾器:用于屬性甄別,對象收集(不可改變過濾對象的屬性和行為)
監(jiān)聽器:用于對象監(jiān)聽,行為記錄(不可改變監(jiān)聽對象的屬性和行為)文章來源:http://www.zghlxwxcb.cn/news/detail-443278.html
攔截器:用于對象攔截,行為干預(yù)(可以改變攔截對象的屬性和行為)文章來源地址http://www.zghlxwxcb.cn/news/detail-443278.html
到了這里,關(guān)于【SpringBoot】過濾器,監(jiān)聽器,攔截器介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!