java - Spring Security 和 JSF,找不到资源/j_spring_security_check.jsp

标签 java spring jsf jakarta-ee spring-security

我在让 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/

相关文章:

java - Spring 3 中的动态表单

jsf - 共享库上的 @FacesComponent

java - 如何用文本文件中的空格替换标签?

java - 未调用 Spring Boot RequestMapping 方法

java - react 器 Mono.defer 调用上的时间戳未更新

css - 如何在 <p :commandLink>? 中显示整个背景图像

jsf - 重定向如果 f :viewParam is empty

java - 如何从日期选择器中获取毫秒数?

java - 如何通过Java中的Reflection API加速类扫描?

java - Tomcat 数据源 - 最大 Activity 连接数