j_spring_security_check 404问题

时间:2012-01-10 18:08:26

标签: java spring spring-security

我正在尝试获得我的春天+休眠+弹簧安全性和tiles2 - " HelloWorld"申请工作,遵循this guide(不幸的是德语)。

我的问题是我得到了一个" 404"登录我的应用程序时出现错误消息。重定向到登录页面按预期工作,但我无法达到" http://localhost:8080/App/j_spring_security_check"当我点击登录按钮时。

我的web.xml看起来像这样:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/defs/applicationContext.xml
        /WEB-INF/defs/applicationContext-security.xml
    </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>

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

和applicationContext-security.xml文件看起来就是这样......

<http use-expressions="true">
    <intercept-url pattern="/index.html" access="permitAll" />
    <intercept-url pattern="/timeout.html" access="permitAll" />
    <intercept-url pattern="/redirect.html" access="permitAll" />
    <intercept-url pattern="/media/**" access="permitAll" />
    <intercept-url pattern="/includes/**" access="permitAll" />
    <intercept-url pattern="/office/**" access="hasRole('ROLE_USER')" />
    <intercept-url pattern="/office/admin/**" access="hasRole('ROLE_ADMIN')" />

    <form-login login-page="/index.html" 
            authentication-failure-url="/index.html?login_error=1"
            default-target-url='/office/kunden.html'
            always-use-default-target='true'
            />
    <logout logout-success-url="/index.html" />
    <remember-me />
    <session-management invalid-session-url="/index.html">
        <concurrency-control max-sessions="2" error-if-maximum-exceeded="true" />
    </session-management>
</http>

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="mysqldataSource" 
                    authorities-by-username-query="select username, authority from benutzer where username = ?"
                    users-by-username-query="select username, password, enabled from benutzer where username = ?"/>
    </authentication-provider>
</authentication-manager>

数据库连接似乎是O.K。

如果有人可以给我一个提示,我会很高兴,因为我已经做了很多谷歌搜索,但还没有找到解决方案。

我使用spring 3.1和tomcat 7.0.23

3 个答案:

答案 0 :(得分:2)

我会检查两件事:

  1. 请求发送
  2. Spring-security config
  3. 要检查请求调度,首先要确保在servlet容器中确保您的应用程序可以访问。意思是,你提到了http://localhost:8080/App/j_spring_security_check。您的应用程序可以在该URL下访问吗? http://localhost:8080/App是否显示正确的内容(HTTP 200)? 同时确保调度程序servlet配置正确。在您提供的教程中,有这一部分:

      <!--  Spring Hauptteil -->
    
      <servlet>
          <servlet-name>spring</servlet-name>
          <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>spring</servlet-name>
          <url-pattern>*.html</url-pattern>
      </servlet-mapping>
    

    如果您没有在web.xml中提供它,那么在最终通过spring-security检查之前,您的请求可能甚至无法正确发送。

    如果这对您没有帮助,请尝试此操作。

    documentation之后,最小配置应足以检查您的设置是否正确。如果你已经按照教程,你可能会犯一些小错误(例如,typeo)会导致spring-security无法正常启动。然后很容易在logger输出中跳过一些错误信息。 我建议你做以下几点。

    1. 更改applicationContext-security.xml以支持文档中提供的最小配置。
    2. 启动该应用程序并转到http://localhost:8080/App/j_spring_security_check
    3. 如果您得到正确的回复 - 尝试修改配置,直到完成为止。

      指向学习 DelegatingFilterProxy(在web.xml中定义)真正做的是将请求委托给Spring的IoC管理的其他过滤器。此过滤器通过安全命名空间在applicationContext-security中定义。如果由于某种原因这不起作用,过滤器将不会被初始化,并且您最终可能会看到http 404而不管其他应用程序是否正常启动。

      Uffff,很多文字;)

答案 1 :(得分:0)

您的配置看起来不错。如果default-target-url='/office/kunden.html'指向不存在的控制器或视图,那么404的一个例子就是它。

检查网址/office/kunden.html是否有效 - 因此停用安全资料(只需添加<security:intercept-url pattern="/**" access="permitAll" />)并尝试使用。

另一个可能出错的问题是,本教程是针对spring 3.0而不是spring 3.0。我不希望这是原因,但试一试并降级。

答案 2 :(得分:0)

对于那些面临相同症状,但针对不同情况的人,那些在负载均衡器后面进行SSL卸载的人,以下答案可能会让您朝着正确的方向前进。我有一个类似的问题,结果是传入的请求处理正确,但是作为响应弹簧安全性发送重定向到由default-target-url属性定义的绝对URL(以http而不是https开头)< / p>

<security:form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" />

现在,客户端浏览器尝试在http上打开重定向的位置,在loadbalancer上失败(仅接受https流量)并报告404 NOT FOUND

我们通过在负载均衡器中为端口443(https)上的所有传入请求添加以下mod_header指令来解决此问题:

RequestHeader set X-Forwarded-Proto "https"

将添加一个额外的标题。如果您运行Jetty之类的应用程序服务器,它将识别此标头并转换传入的请求。 (见http://www.gossamer-threads.com/lists/apache/users/407272