从 servlet 过滤器和标签访问 Spring bean

Posted

技术标签:

【中文标题】从 servlet 过滤器和标签访问 Spring bean【英文标题】:Accessing Spring beans from servlet filters and tags 【发布时间】:2011-01-25 21:03:50 【问题描述】:

我可以使用

在我的 Servlet 中访问 Spring bean
WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 

在 Servlet 的 init 方法中。

我想知道 servlet 过滤器是否有与 WebApplicationContext 等效的方法? 另外,是否可以在标签类中访问 Spring bean?

【问题讨论】:

【参考方案1】:

有几种方法可以得到它

    WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getFilterCongig().getServletContext());

    WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

然后

springContext.getBean("myBeanId");

【讨论】:

【参考方案2】:

您可以使用 Spring 文档中提到的 DelegatingFilterProxy:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

您只需使用与 web.xml 中声明的过滤器名称相同的 bean 名称来声明您的真实过滤器 bean:

web.xml:

    <filter>
       <filter-name>SpringTestFilter</filter-name>
       <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
       <filter-name>SpringTestFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

applicationContext.xml:

    <bean id="SpringTestFilter" class="com.company.app.servlet.SpringTestFilter" />  

【讨论】:

有没有例子说明如何使用没有 web.xml src 文件的 Java 配置来完成?【参考方案3】:

您可以使用 ContextEsposingHttpServletRequest 包装器将所有 bean 作为请求属性。

【讨论】:

【参考方案4】:

对于过滤器 - 使用 Filter.init():

public void init(FilterConfig config) 
    WebApplicationContext springContext = 
        WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());

对于标签 - 使用 TagSupport.pageContext(注意它在 SimpleTagSupport 中不可用):

WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());

【讨论】:

我觉得我要提出一个愚蠢或明显的问题(我现在想花时间寻找它),但无论如何我都会这样做:上下文是否总是(在每次运行)在过滤器的 init 方法中准备好了吗?不管答案如何,一个可证明的论点都是值得赞赏的。谢谢 @niconic:应用程序上下文由ContextLoaderListener 初始化,所有 servlet 上下文侦听器在Filters 初始化之前调用,根据 Servlet API 规范 3.0 第 10.12 节 Web 应用程序部署。 axtavt,完美,正是我想要的,非常感谢 这个解决方案打破了 IOC 范式。更好的解决方案是使用 DelegatingFilterProxy。 这个解决方案似乎不再起作用了。在过滤器上,getWebApplicationContext 返回 null。

以上是关于从 servlet 过滤器和标签访问 Spring bean的主要内容,如果未能解决你的问题,请参考以下文章

如何从 servlet 中访问相应 servlet 过滤器中的变量集?

从过滤器访问 servlet 注释

Spring MVC ⾼级技术:监听器过滤器和拦截器

Spring MVC ⾼级技术:监听器过滤器和拦截器

Spring MVC ⾼级技术:监听器过滤器和拦截器

21. Spring Boot过滤器监听器从零开始学Spring Boot