//小人

Filter过滤器和Interceptor过滤器

Filter过滤器

  过滤器Filter依赖于servlet容器,基于函数回调,他几乎可以对所有的请求进行过滤,过滤器只能在容器初始化的时候调用一次

Inerceptor拦截器

  拦截器Inerceptor依赖于web框架,在SpringMVC中就依赖于SrpingMVC,在实现上基于java的反射机制实现,属于面向切面编程的一种运用。

由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入进行一些业务操作。同时一个拦截器实例在一个Controller生命周期内可以多次调用,缺点就是拦截器只能对Controller请求进行拦截,对其他的一些访问比如静态资源访问的请求则没有办法进行拦截处理

Filter过滤器实现

复制代码
@Configuration
public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("在DispatcherServlet之前执行");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("在返回给客户端之前执行,但是在Interceptor拦截器之后执行");
    }
}
复制代码

fileterChain.doFilter()方法的作用:

  filter过滤器是以链表的形式进行调用的,配置了几个就有几个,一个个串联在一起,doFilter方法中的filterChain,doFilter方法的作用就是将请求转发给过滤器链表中的下一个过滤器如果没有下一个过滤器就会回到原本的过滤器如果不加filterChain,doFilter()方法就不会向下执行了。

 

Interceptor拦截器代码实现

复制代码
@Component
public class Interceptor1 implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("1************在DispatcherServlet之前执行**********");
        return true;
    }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("1************在controller执行之后的DispatcherServlet之后执行**********");
    }

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("1************在页面渲染完成返回给客户端之前执行**********");
    }
}
复制代码
复制代码
//配置拦截
@Component
public class WebMvcConfig implements WebMvcConfigurer { @Autowired private Interceptor1 interceptor1; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor1).addPathPatterns("/*"); } }
复制代码
posted @   H_Q  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示