我在让 Spring Security 和 JSF 正常协同工作时遇到了一些困难。我创建了一个基本的登录页面,当单击“登录”按钮时,该页面返回“登录”结果。但是,我收到 404“无法找到资源/j_spring_security_check.jsp”。由于某种原因,它在我的 faces-config 中指定的末尾添加了一个 .jsp。我能够通过在操作方法中执行代码端重定向来实现此目的(即: context.redirect(root + "/j_spring_security_check?j_username="+ userName + "&j_password="+ password); )。不过,我真的很想将 j_spring_security_check 放在我的 faces-config 中。我的代码如下所示:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>BBB_WEB</display-name>
<context-param>
<description>
Comma-delimited list of context-relative resource paths
under which the JSF implementation will look for application
configuration resources, before loading a configuration
resource named /WEB-INF/facesconfig.xml (if such a resource
exists).
</description>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value></param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<!-- <context-param>-->
<!-- <param-name>facelets.LIBRARIES</param-name>-->
<!-- <param-value>/WEB-INF/tomahawk.taglib.xml</param-value>-->
<!-- </context-param>-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:applicationContext-security.xml
</param-value>
</context-param>
<context-param>
<description>
The location where state information is saved. Valid values
are 'server' (typically saved in HttpSession) and 'client'
(typically saved as a hidden field in the form. Default is
server.
</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<description>
Number of Views to be stored in the session when Server-Side
State Saving is being used. Default is 15.
</description>
<param-name>
com.sun.faces.NUMBER_OF_VIEWS_IN_SESSION
</param-name>
<param-value>15</param-value>
</context-param>
<context-param>
<description>
If set to true while server-side state saving is being used,
a serialized representation of the view is stored on the
server. This allows for failover and sever clustering
support. Default is false. This parameter is not available
in JSF 1.0.
</description>
<param-name>com.sun.faces.enableHighAvailability</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<description>
If set to true while client-side state saving is being used,
reduces the number of bytes sent to the client by
compressing the state before it is encoded and written as a
hidden field. Default is false. This parameter is not
available in JSF 1.0.
</description>
<param-name>com.sun.faces.COMPRESS_STATE</param-name>
<param-value>false</param-value>
</context-param>
<listener>
<listener-class>
com.sun.faces.config.ConfigureListener
</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>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<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>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>/jsp/public/login.jsf</welcome-file>
</welcome-file-list>
</web-app>
面孔配置
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<!-- =========== FULL CONFIGURATION FILE ================================== -->
<faces-config>
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
</application>
<navigation-rule>
<from-view-id>/jsp/*</from-view-id>
<!-- loginBean -->
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/j_spring_security_check</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{loginBean.newAccountAction}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/jsp/public/newAccount.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
登录.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%-- jsf:pagecode language="java" location="/src/pagecode/jsp/public1/Login.java" --%><%-- /jsf:pagecode --%>
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="GENERATOR" content="Rational Application Developer">
</head>
<f:view>
<body>
<h:form id="login">
<h:inputHidden id="sessionChecker" value="#{loginBean.sessionTrackerValue}" />
<%@ include file="/jsp/public/header.jsp"%>
<div id="content">
<div id="headerImage">
<h:graphicImage id="headerImage" url="#{headerBean.headerImageUrl}"/>
</div>
<div id="colMerge">
<h2>
<h:outputText id="contentTitleText" value="#{loginBean.pageTitle}"/>
</h2>
<h:panelGrid columns="1">
<h:messages id="errorMsg"/>
<h:panelGroup>
<h:outputText value="Username " />
<h:inputText id="j_username" value="#{loginBean.userName}" />
</h:panelGroup>
<h:panelGroup>
<h:outputText value="Password " />
<h:inputSecret id="j_password" value="#{loginBean.password}"/>
</h:panelGroup>
<h:commandButton value="Login" action="login"/>
<h:commandLink value="New Account" action="#{loginBean.newAccountAction}">
<h:outputText id="newAccountLoginText" value="" />
</h:commandLink>
</h:panelGrid>
</div>
</div>
</h:form>
</body>
</f:view>
</html>
applicationContext-security
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<security:global-method-security secured-annotations="enabled" />
<security:http auto-config="true" access-denied-page="/jsp/public/loginError.jsf">
<security:intercept-url pattern="/jsp/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/jsp/player/**" access="ROLE_USER,ROLE_ADMIN" />
<security:intercept-url pattern="/jsp/admin/**" access="ROLE_ADMIN" />
<security:form-login
login-page="/jsp/public/login.jsf"
default-target-url="/jsp/player/myPicks.jsf"
authentication-failure-url="/jsp/public/login.jsf" />
<security:logout logout-url="/jsp/public/logout.jsf" logout-success-url="/jsp/public/login.jsf" />
</security:http>
<security:authentication-provider user-service-ref="userDetailsService">
</security:authentication-provider>
<bean id="userDetailsService" class="graz.bbb.service.UserDetailsServiceImpl">
<constructor-arg ref="playerDao"/>
</bean>
</beans>
大家有什么想法吗?
最佳答案
您在 Websphere 上运行吗?您收到此错误吗?
Error 404: SRVE0190E: File not found: /j_spring_security_check
如果是这样,您需要在本地服务器中配置 Webcontainer 定制属性并将“com.ibm.ws.webcontainer.invokefilterscompatibility”设置为“true”。我在 Websphere 6.1 中运行 Spring Security 3.x 时遇到同样的问题,并且已修复。
您可以在 http://www-01.ibm.com/support/docview.wss?uid=swg24014758 阅读更多内容
顺便说一句,我看到您的错误消息是“无法找到资源/j_spring_security_check.jsp。”。该链接中不应该有“.jsp”,它应该只是“/j_spring_security_check”。解决这个问题,它应该对你有用。
关于java - Spring Security 和 JSF,找不到资源/j_spring_security_check.jsp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4409639/