2012-07-06 94 views
0

我正試圖將Spring Security添加到項目中。 在web.xml中添加了一段代碼後,所有網址都給出了404。更改web.xml中的篩選器後出現錯誤404

出了什麼問題?

這是一個Maven項目,Spring MVC,hibernate,postgres。

(我不知道什麼信息是相關的描述的情況)

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

    <!-- The definition of the Root Spring Container shared by all Servlets 
     and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- After insert this block, all URL's return 404 error --> 
    <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> 


</web-app> 

UPDATE:

Grave: Exception starting filter springSecurityFilterChain 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:529) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1094) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:276) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079) 
    at org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:217) 
    at org.springframework.web.filter.DelegatingFilterProxy.initFilterBean(DelegatingFilterProxy.java:145) 
    at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:179) 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258) 
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4638) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1366) 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1454) 
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:295) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1379) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1537) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1547) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1526) 
    at java.lang.Thread.run(Thread.java:722) 
+0

你添加了哪些代碼塊使其失敗? – kosa 2012-07-06 20:42:59

+0

@thinksteep last and Falci 2012-07-06 20:45:06

+0

您是否檢查過濾器是否被調用?我認爲你的過濾器在發送給控制器之前弄亂了一些東西。 – kosa 2012-07-06 20:47:30

回答

0

您需要定義您的過濾器。

像這樣:

<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> 
+0

你檢查過他的配置嗎? – 2012-07-06 21:16:49

+0

@Brent但這是問題的一部分 – Falci 2012-07-10 20:29:11

0

看來你沒有配置springSecurityFilterChain豆。

也許這個link可以幫助你。在那裏的人只是Spring上下文配置這樣的豆:

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.util.FilterChainProxy"> 
    <filter-chain-map path-type="ant"> 
     <filter-chain pattern="/**" filters="sif"/> 
    </filter-chain-map> 
</beans:bean> 

<beans:bean id="sif" 
     class="org.springframework.security.context.HttpSessionContextIntegrationFilter" /> 

的名字是非常重要的

從春天Documentation

注意這個過濾器其實是一個DelegatingFilterProxy,而不是 這個類將實際實現過濾器的邏輯。 DelegatingFilterProxy所做的是將Filter的方法委託給 從Spring應用程序上下文獲得的bean。這個 使bean可以受益於Spring Web應用程序上下文生命週期支持和配置靈活性。該bean必須實現javax.servlet.Filter,它必須與filter-name元素中的 具有相同的名稱。參考DelegatingFilterProxy 的Javadoc以獲取更多信息

0

定義您的過濾器在web.xml

<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> 

製作彈簧的security.xml豆文件應該象下面這樣。

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 
    <beans:import resource="login-service.xml"/> 
    <http> 
    <intercept-url pattern="/home*" access="ROLE_USER,ROLE_ADMIN" /> 
    <intercept-url pattern="/admin*" access="ROLE_ADMIN" /> 
    <form-login login-page="/login.jsp" default-target-url="/home" authentication-failure-url="/login.jsp?error=true"/> 
    <logout logout-success-url="/login.jsp" /> 
    <anonymous username="guest" granted-authority="ROLE_GUEST"/> 
    <remember-me/> 
    </http> 
    <authentication-manager> 
    <authentication-provider> 
     <!--<user-service>--> 
     <!--<user name="admin" password="secret" authorities="ROLE_ADMIN,ROLE_USER" />--> 
     <!--<user name="user1" password="1111" authorities="ROLE_USER" />--> 
     <!--</user-service>--> 
     <jdbc-user-service data-source-ref="dataSource" 
      users-by-username-query="select username,password, 'true' as enabled from USER_DETAILS where username=?" 
      authorities-by-username-query="select USER_DETAILS.username , USER_AUTH.AUTHORITY as authorities from USER_DETAILS,USER_AUTH 
      where USER_DETAILS.username = ? AND USER_DETAILS.username=USER_AUTH.USERNAME "/> 
    </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

根據您的要求更改屬性。 你可以在這裏找到一些示例項目:http://blog.rajithdelantha.com/2012/07/spring-security-part-1-sample-login.html