#5解析filter为什么不能注入bean和解决办法以及filter、interceptor、aspect之间的执行顺序

目录

 

1、定义

2、Filter中为什么不能使用bean

3、解决办法

3.1、使用Interceptor替代

3.2、使用DelegatingFilterProxy


 


 

1、定义

Filter可认为是Servlet的一种“变种”,过滤器可以拦截到方法的请求和响应,对请求响应做出过滤操作

Servlet是Java Web开发中的组件,它负责处理HTTP请求和响应。Servlet通常被用来处理业务逻辑,生成动态的HTML页面或者返回JSON数据等。

Interceptor是Spring MVC框架中的一种拦截器,它可以在请求到达Controller之前或者响应返回给客户端之前对请求或响应进行处理。Interceptor通常被用来做一些通用的处理,比如登录验证、权限验证、日志记录等。

Aspect切面是Spring AOP 操作的一种,可以对操作进行横向的拦截,最大的优势在于它可以获取执行方法的参数,对方法进行统一的处理。

#5解析filter为什么不能注入bean和解决办法以及filter、interceptor、aspect之间的执行顺序_第1张图片

 

其中Interceptor和Aspect均被SpringMVC管理,其核心是DispatcherServlet,继承自HttpServlet,因此从图中可以理解到,Filter和SpringMVC均存活在web容器中,具有平级的关系,只不过Filter在SpringMVC之前初始化。

2、Filter中为什么不能使用bean

由于Filter在SpringMVC之前加载,因此在Filter中注入的bean还没有被Spring容器进行加载,因此为null。

3、解决办法

3.1、使用Interceptor替代

当Spring容器将bean加载完毕后,在Interceptor中自然可以注入其他bean

3.2、使用DelegatingFilterProxy

DelegatingFilterProxy提供了 web容器和应用程序上下文之间的链接,在初始化期间,DelegatingFilterProxy 获取 filter-name 并从 Spring 应用程序上下文中检索具有该名称的 bean。

DelegatingFilterProxy 的 doFilter() 方法将所有调用委托给Spring bean,使我们可以在过滤器bean中使用所有Spring功能。

示例:

过滤器:

@Component("loggingFilter")
public class CustomFilter implements Filter {
    private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig config) throws ServletException {
        // initialize something 
    }

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       HttpServletRequest req = (HttpServletRequest) request;
       LOGGER.info("Request Info : " + req);
       chain.doFilter(request, response);
    }

    @Override
    public void destroy() { 
    }
}

在web.xml中配置:


	loggingFilter
    org.springframework.web.filter.DelegatingFilterProxy


    loggingFilter
    /*

或者通过配置类配置:

public class ApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected javax.servlet.Filter[] getServletFilters() {
       DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy();
       delegateFilterProxy.setTargetBeanName("loggingFilter");
       return new Filter[]{delegateFilterProxy};
    }
}

如果对你有帮助,点赞、收藏、关注是我更新的动力!

 

 往期精彩:

#1maven打包时指定profile过滤resources的一些总结-CSDN博客文章浏览阅读737次,点赞28次,收藏23次。maven打包时指定profile过滤resources的一些总结https://blog.csdn.net/weixin_42718399/article/details/135386153?spm=1001.2014.3001.5502

#2Vite+Vue3+SpringMVC前后端分离 解决跨域问题和session每次请求不一致问题-CSDN博客文章浏览阅读1k次,点赞37次,收藏14次。Vite+Vue3+SpringMVC前后端分离通过vite/nginx解决跨域问题和session一致性问题https://blog.csdn.net/weixin_42718399/article/details/135388463?spm=1001.2014.3001.5502

#3Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份-CSDN博客文章浏览阅读985次,点赞28次,收藏17次。Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份https://blog.csdn.net/weixin_42718399/article/details/135404525?spm=1001.2014.3001.5502

#4详解@RequestParam、@RequestBody和@PathVariable-CSDN博客文章浏览阅读935次,点赞26次,收藏19次。详解@RequestParam @RequestBody和@PathVariablehttps://blog.csdn.net/weixin_42718399/article/details/135475436?spm=1001.2014.3001.5501

 

你可能感兴趣的:(SSM,java,spring,mvc)