区别:
一、过滤器与拦截器的对比
1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。
2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。
3.使用场景不同:灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,Filter主要是针对URL地址做一个编码、过滤掉没用的参数、安全校验等,要是处理些繁杂的业务逻辑,还是建议用拦截器方便注册和使用容器中的对象。
4.实现方式不同:过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射。
5.拦截范围:过滤器几乎可以对所有请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。(因为拦截器内部是JDK动态代理实现的,拦截的对象只能是实现了接口的对象,而不能拦截url这种链接)
动态代理的方式有两种:
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGLIB动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。
二、监听器
监听器是一种Servlet特殊类,它们能帮助开发者监听Web中特定的事件,比如ServletContext、HttpSession、ServletRequest等对象的创建和销毁,在某些动作前后增加处理,实现监控。 监听器的使用场景很多,比如监听ServletContext用来初始化一些数据、监听HttpSession用来获取当前在线的人数、监听ServletRequest对象来获取用户的访问信息等。
使用:
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; } }
方式二:
@Order(1)
// 注入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() { } }
order定义filter的优先级,值越小优先级越高,因此运行顺序为
filter3—doFilter—>filter2—doFilter—>filter1—doFilter—>控制器方法—>返回到filter1—>返回到filter2—>返回到filter3
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"; } }
三个器写好,配置到一块
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired MyInterceptor myInterceptor; /** * 注册拦截器 * @return */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); } /** * 注册过滤器 * @return */ @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); filterRegistration.setFilter(new MyFilter()); filterRegistration.addUrlPatterns("/*"); return filterRegistration; } /** * 注册监听器 * @return */ @Bean public ServletListenerRegistrationBean registrationBean(){ ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(); registrationBean.setListener(new MyHttpRequestListener()); registrationBean.setListener(new MyHttpSessionListener()); return registrationBean; } }
转 : https://blog.csdn.net/heweimingming/article/details/79993591
https://www.cnblogs.com/haixiang/p/12000685.html
https://www.cnblogs.com/dayu123/p/16486482.html
https://blog.csdn.net/zth13015409853/article/details/126404344
https://blog.csdn.net/cristianoxm/article/details/119735912
https://www.cnblogs.com/hanliukui/p/13198173.html
标签:拦截器,spring,void,boot,过滤器,FilterRegistrationBean,Override,public From: https://www.cnblogs.com/fps2tao/p/17349553.html