首页 > 编程知识 正文

过滤器拦截器监听器的区别,拦截器监听器过滤器执行顺序

时间:2023-05-06 04:40:41 阅读:17187 作者:2817

过滤器过滤器介绍:需要实现过滤器接口的过滤器可以认为是servlet的“增强版”,主要用于用户请求的预处理和http servlet的后处理,是典型的处理链。 Filter可以像对servlet一样对用户请求生成响应,但实际上很少使用Filter对用户请求生成响应。

使用Filter的完整过程是,Filter预处理用户请求,然后将请求传递给servlet进行预处理,生成响应,最后Filter对服务器响应进行后处理。

过滤器使用方案:在http servlet到达servlet之前阻止客户的http servlet请求。

如果需要,还可以检查HttpServletRequest以更改HttpServletRequest标头和数据。

在http servlet响应到达客户端之前阻止http servlet响应。

如果需要,也可以检查HttpServletResponse以更改HttpServletResponse标头和数据。

过滤器配置:在SpringBoot配置中,类MyFilter实现过滤器接口以重写内部方法,并将该类导入到FilterRegistrationBean类中。

importorg.spring framework.stereotype.com ponent; 导入javax.servlet.*; import java.io.IOException; //使用自定义拦截器实现过滤器接口@ componentpublicclassmyfilterimplementsfilter { @ overridepublicvoidinit (过滤器配置文件) throws ServletException { //初始化:容器启动时为system.out.println (myfilter…init…); } @ overridepublicvoiddofilter (servletrequestservletrequest,ServletResponse servletResponse, 过滤器通道过滤器通道) throooid servlet exception//dispatcher servlet之前包含system.out.println (myfilter…do filter……); //决定是否释放。 如果不设置,则过滤器chain.do过滤器(servlet request,servletResponse ); //视图页面在返回到客户端之前运行,但运行顺序是在Interceptor之后system.out.println (' myfilter . do filter之后……); } @Override public void destroy () system.out.println ) ' myfilter.destroy…' ); }} import com.yc.filter.MyFilter; importorg.spring framework.beans.factory.annotation.auto wired; importorg.spring framework.boot.web.servlet.filterregistrationbean; importorg.spring帧work.context.annotation.bean; importorg.spring framework.context.annotation.configuration; @Configuration //将当前配置类publicclassmywebconfig { @ auto wired//自定义过滤器注入到私有过滤器过滤器过滤器中; //设置拦截器@ beanpublicfilterregistrationbeaninitfilter ((filterregistrationbeanregistrationbean=newfilterrregistration ) 注册bean.set name (myfilter ); registration bean.add URL patterns ('/* '; //中断其路径的返回注册bean; Interceptor接口介绍:需要实现Interceptor接口

 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

Interceptor配置: import org.springframework.lang.Nullable;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;//自动以拦截器@Componentpublic class MyInterceptor implements HandlerInterceptor { /** * 在controller之前执行 * */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor....preHandle...."); return true; } /** * 在controller执行之后的DispatcherServlet之后执行 * */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor....postHandle...."); } /** * 在页面渲染完成返回给客户端之前执行 * */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("MyInterceptor....afterCompletion...."); }}

将拦截器配置在SpringBoot中,这点与Filter的配置有所不同,Interceptor需要配置类实现WebMvcConfigurer接口,然后进行配置。如下所示:

import com.yc.interceptor.MyInterceptor;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;@Configurationpublic class MyWebMVCConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry){ //添加我们的拦截器配置 //拦截所有请求 registry.addInterceptor(myInterceptor).addPathPatterns("/**"); }} 过滤器和拦截器的区别: 过滤器可以修改request,而拦截器不能。过滤器只能在请求的前后使用,而拦截器可以详细到每个方法。过滤器可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。拦截器可以拿到你请求的控制器和方法,却拿不到请求方法的参数。Filter是基于函数回调的,而Interceptor则是基于Java反射的。Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。