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

我可以使用

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

在 Servlet 的 init 方法中。

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

【问题讨论】:

    标签: spring servlets tags javabeans servlet-filters


    【解决方案1】:

    有几种方法可以得到它

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

    2. 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。
        猜你喜欢
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 2013-02-23
        • 2018-11-09
        • 2011-12-14
        • 2010-11-26
        • 2013-04-09
        相关资源
        最近更新 更多