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 由添加ContextLoaderListener
默认从 WEB-INF 目录中加载一个名为 applicationContext.xml 的 xml 文件。一旦你指定了一个名为 contextConfigLocation 的context-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 2.2 内存消耗:为啥 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?