从 servlet 过滤器和标签访问 Spring bean
Posted
技术标签:
【中文标题】从 servlet 过滤器和标签访问 Spring bean【英文标题】:Accessing Spring beans from servlet filters and tags 【发布时间】:2011-01-25 21:03:50 【问题描述】:我可以使用
在我的 Servlet 中访问 Spring beanWebApplicationContext 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 上下文侦听器在Filter
s 初始化之前调用,根据 Servlet API 规范 3.0 第 10.12 节 Web 应用程序部署。
axtavt,完美,正是我想要的,非常感谢
这个解决方案打破了 IOC 范式。更好的解决方案是使用 DelegatingFilterProxy。
这个解决方案似乎不再起作用了。在过滤器上,getWebApplicationContext 返回 null。以上是关于从 servlet 过滤器和标签访问 Spring bean的主要内容,如果未能解决你的问题,请参考以下文章