拦截器与过滤器的区别

1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
如下图:

2、拦截器可以获取ioc容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是javaee标准,只需依赖servlet api ,不需要依赖spring。
过滤器拦截器运行先后步骤:

其中第2步,springmvc的机制是由dispaterservlet来分发请求给不同的controller,其实这一步是在servlet的service()方法中执行的.
3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。
何时使用拦截器?何时使用过滤器?
- 如果是非spring项目,那么拦截器不能用,只能使用过滤器。
- 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
- 如果是处理dispaterservlet前后,只能使用过滤器。
spring boot 使用过滤器
两种方式:
1、使用spring boot提供的filterregistrationbean注册filter
2、使用原生servlet注解定义filter
两种方式的本质都是一样的,都是去filterregistrationbean注册自定义filter
方式一
①、先定义filter:
package com.hwm.filter;
import javax.servlet.*;
import java.io.ioexception;
public class myfilter implements filter {
@override
public void init(filterconfig filterconfig) throws servletexception {
}
@override
public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
// do something 处理request 或response
system.out.println("filter1");
// 调用filter链中的下一个filter
filterchain.dofilter(servletrequest,servletresponse);
}
@override
public void destroy() {
}
}②、注册自定义filter
@configuration
public class filterconfig {
@bean
public filterregistrationbean registrationbean() {
filterregistrationbean filterregistrationbean = new filterregistrationbean(new myfilter());
filterregistrationbean.addurlpatterns("/*");
return filterregistrationbean;
}
}方式二
// 注入spring容器
@component
// 定义filtername 和过滤的url
@webfilter(filtername = "my2filter" ,urlpatterns = "/*")
public class my2filter implements filter {
@override
public void init(filterconfig filterconfig) throws servletexception {
}
@override
public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
system.out.println("filter2");
}
@override
public void destroy() {
}
}spring boot拦截器的使用
①、定义拦截器:
public class myinterceptor implements handlerinterceptor {
@override
public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
system.out.println("prehandle");
return true;
}
@override
public void posthandle(httpservletrequest request, httpservletresponse response, object handler, @nullable modelandview modelandview) throws exception {
system.out.println("posthandle");
}
@override
public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, @nullable exception ex) throws exception {
system.out.println("aftercompletion");
}
}②、配置拦截器:
@configuration
public class interceptorconfig implements webmvcconfigurer {
@override
public void addinterceptors(interceptorregistry registry) {
registry.addinterceptor(new myinterceptor());
}
}③controller演示:
@restcontroller
public class ucontroller {
@getmapping("/home")
public string home(){
system.out.println("home");
return "myhome";
}## 标题 ##
}输出:
prehandle
home
posthandle
aftercompletion
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论