过滤器与拦截器的区别

1.过滤器:
斜体样式依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
2.拦截器:
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。
但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理

3.过滤器和拦截器的区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。过滤器

@Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
        System.out.println("before...");
        chain.doFilter(request, response);
        System.out.println("after...");
    }
/**
chain.doFilter(request, response);
这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在
chain.doFilter(request, response);
这个方法中进行的。拦截器拦截器是被包裹在过滤器之中的。
*/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
        System.out.println("preHandle");
        returntrue;
        }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {
        System.out.println("postHandle");
        }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {
        System.out.println("afterCompletion");
        }

a.
·preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println(“before…”)][chain.doFilter(request, response)]之间执行。  
b.
preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。  
c.
afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println(“after…”)]之间执行。  
SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 过滤器Filter) 是从 J2EE 中引入的概念,可以视为 Servlet 的“增强版”,主要用于对用户请求进行预处理和后处理,形成一个典型的处理链。虽然 Filter 也可以生成响应,但通常不用于直接响应用户请求。它的用途广泛,包括身份验证、日志记录、数据压缩、加密等。例如,通过 Filter 实现权限过滤,可以将请求 URL 用户无权限访问的 URL 列表进行对比。 在 Spring Boot 中,实现过滤器的方式是通过自定义类实现 javax.servlet.Filter 接口,并重写 init、destroy 和 doFilter 方法。init 方法用于初始化,destroy 方法用于销毁时清理资源,doFilter 方法则用于实现过滤逻辑。以下是一个简单的时间过滤器示例: 拦截器(Interceptor) 是 Spring MVC 中的机制,类似于过滤器,可以在请求处理前后执行操作。它常用于身份验证、日志记录、性能监控等场景。拦截器的实现方式是通过实现 HandlerInterceptor 接口,并在 Spring MVC 配置中添加拦截器配置。以下是一个简单的拦截器示例: 切片(Aspect) 是面向切面编程(AOP)中的概念,可以在不修改源代码的情况下动态地添加或修改功能,常用于日志记录、性能监控、身份验证等。切片的实现方式是通过实现 Aspect 接口,并在 Spring 配置中添加切片配置。以下是一个简单的切片示例: 过滤器 是基于 Servlet API 的,作用于 Servlet 容器级别,对所有请求进行处理。 拦截器 是基于 Spring MVC 的,作用于 Spring MVC 框架内,对控制器方法的调用进行拦截。 切片 是基于 AOP 的,作用于 S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值