JSF Managed Beans 不使用 spring 安全过滤器

Posted

技术标签:

【中文标题】JSF Managed Beans 不使用 spring 安全过滤器【英文标题】:JSF Managed Beans not working with spring security filter 【发布时间】:2014-02-02 05:37:41 【问题描述】:

我在我的 jsf spring 应用程序中偶然发现了一个问题。 成功设置后,我向我的应用程序添加了弹簧安全性,突然在 jsf bean 中注入 @ManagedProperty 停止工作。更具体地说,像这样注入的属性在使用它们时是空的。

我正在使用 jsf 2.1、spring 3.1(核心 + 安全性)

配置如下所示: web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
  </welcome-file-list>

   <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
   </listener>

  <listener>
    <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>
  <listener>
    <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
  </listener>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
  </context-param>

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

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

      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-security-context.xml</param-value>
      </context-param>

</web-app>

FacesServlet 是默认的 servlet 调度程序。

在我添加的面孔配置中

<application>
        <el-resolver>
                org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application>

...

jsf 托管 bean 如下所示:

@ManagedBean
public class InterviewForm 

    @ManagedProperty (value="#springInterviewHelper")
    private SpringInterviewHelper springInterviewHelper;

...

springInterviewHelper 以在 web.xml 中添加的 springSecurityFilterChain 结束。如果我删除该过滤器一切正常,除了我无法使用弹簧安全性:)。通过调试检查,堆栈跟踪中的唯一修改与安全过滤有关,因此这可能会导致注入失败。 如果可能的话,我想使用 jsf 注释而不是 spring 的注释,因为我可以使用 @ViewScoped 和 jsf 托管 bean 的其他舒适的东西。这可能吗?什么可能导致注入失败?

非常感谢, 马吕斯

【问题讨论】:

我猜,您没有加载其他应用程序上下文 xml 文件。看起来你只是在加载你的 spring 安全相关配置。 applicationContext.xml 由添加 contextConfigLocationclasspath:applicationContext.xml .xml。如果我不补充,我应该有其他与休眠相关的配置问题,例如 它现在可以工作了:),我刚刚明白你的意思,applicationContext 实际上是默认加载的,直到我添加了 context-param 标记。现在看来我必须明确提及它。非常感谢! 【参考方案1】:

ContextLoaderListener 默认从 WEB-INF 目录中加载一个名为 applicationContext.xml 的 xml 文件。一旦你指定了一个名为 contextConfigLocationcontext-param,这个默认值就不再适用了。另请参阅reference guide。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-security-context.xml</param-value>
</context-param>

上面的配置会导致ONLY加载提到的配置文件,它不会再加载applicationContext.xml文件了。现在您只需将上述文件添加到param-value 标签即可轻松解决此问题。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/spring-security-context.xml</param-value>
</context-param>

这应该可以解决问题。

【讨论】:

以上是关于JSF Managed Beans 不使用 spring 安全过滤器的主要内容,如果未能解决你的问题,请参考以下文章

CAS认证后在JSF Managed Bean中获取LDAP属性

即使在刷新页面后,Firefox 也会在 JSF-Viewscoped-Managed-Bean 中保留数组的内容

JSF Managed bean 中 List 的初始化

JSF中的循环managebean检测错误

JSF 2.2 内存消耗:为啥 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?

JSF Spring Bean 设置属性