Spring Security登录返回404

时间:2015-10-16 08:47:41

标签: java spring jsp spring-mvc spring-security

我目前正在使用Spring框架中的博客。我正在实现Spring Security以进行登录。一切都按预期工作,直到我提交始终返回404代码的登录凭据。

这是我的web.xml cod e

<?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>avispring</display-name>          

<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-database.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>/admin/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<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>/</url-pattern>        
</servlet-mapping>

这是我的春季安全码:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/avispring"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>
<security:debug/>
<security:http auto-config="true">
    <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
    <security:intercept-url pattern="/j_spring_security_check" access="permitAll"/>
    <security:form-login        
    login-page="/login.html"
    authentication-failure-url="/login?login_error=1"
    default-target-url="/admin/home.html"/>     
</security:http>

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service 
            data-source-ref="dataSource"
            users-by-username-query="select USERNAME,PASSWORD,ENABLED from USER_AUTHENTICATION where USERNAME=?"
            authorities-by-username-query="select u1.USERNAME,u2.ROLE from USER_AUTHENTICATION u1,USER_AUTHORIZATION u2 where u1.USER_ID=u2.USER_ID and u1.USERNAME=?"/>
    </security:authentication-provider>
</security:authentication-manager>

我的login.jsp代码的一部分是

<form action="<c:url value="/login"/>" method="post">
      <div class="form-group has-feedback">
        <input type="email" class="form-control" placeholder="Email" name="username">
        <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
      </div>
      <div class="form-group has-feedback">
        <input type="password" class="form-control" placeholder="Password" name="password">
        <span class="glyphicon glyphicon-lock form-control-feedback"></span>
      </div>
      <div class="row">
        <div class="col-xs-8">
          <div class="checkbox icheck">
            <label>
              <input type="checkbox"> Remember Me
            </label>
          </div>
        </div><!-- /.col -->
        <div class="col-xs-4">
          <button type="submit" class="btn btn-primary btn-block btn-flat"     name="submit">Sign In</button>
        </div><!-- /.col -->
      </div>
    </form>

,控制台输出

2015年10月16日上午1:06:03 org.springframework.web.servlet.DispatcherServlet noHandlerFound 警告:在DispatcherServlet中找不到带有URI [/ avispring / login]的HTTP请求的映射,其名称为&#39; spring&#39;

注意:

  1. 我使用的是spring 4.2.1和spring security 4.0.2
  2. 大多数论坛都指向上下文路径,即 [appname / login] [appname / j_spring_security_check] ,我认为我的确可以。
  3. 请帮忙......

    更新

    当我使用log4j时,表单提交时的调试输出如下:

      

    DEBUG:org.springframework.web.servlet.DispatcherServlet - 绑定到线程的请求上下文:org.apache.catalina.connector.RequestFacade@c8b445   DEBUG:org.springframework.web.servlet.DispatcherServlet - 名称为&#39; spring&#39;的DispatcherServlet处理[/ avispring / login]的POST请求   DEBUG:org.springframework.web.servlet.DispatcherServlet - 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@16fffcf],名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 查找路径/登录的处理程序方法   DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 没找到[/ login]的处理程序方法   DEBUG:org.springframework.web.servlet.DispatcherServlet - 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@138f01b],名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping - 找不到[/ login]的处理程序映射   DEBUG:org.springframework.web.servlet.DispatcherServlet - 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@1ff154c],名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - 找不到[/ login]的处理程序映射   警告:org.springframework.web.servlet.PageNotFound - 在DispatcherServlet中找不到带有URI [/ avispring / login]的HTTP请求的映射,名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.DispatcherServlet - 清除线程绑定请求上下文:org.apache.catalina.connector.RequestFacade@c8b445   DEBUG:org.springframework.web.servlet.DispatcherServlet - 已成功完成请求   DEBUG:org.springframework.web.context.support.XmlWebApplicationContext - 在WebApplicationContext中为命名空间发布事件&#39; spring-servlet&#39 ;: ServletRequestHandledEvent:url = [/ avispring / login];客户= [0:0:0:0:0:0:0:1];方法= [POST];的servlet = [弹簧];会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54];用户= [零]。时间= [3毫秒];状态= [OK]   DEBUG:org.springframework.web.context.support.XmlWebApplicationContext - 在Root WebApplicationContext中发布事件:ServletRequestHandledEvent:url = [/ avispring / login];客户= [0:0:0:0:0:0:0:1];方法= [POST];的servlet = [弹簧];会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54];用户= [零]。时间= [3毫秒];状态= [OK]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 绑定到线程的请求上下文:org.apache.catalina.core.ApplicationHttpRequest@bb82df   DEBUG:org.springframework.web.servlet.DispatcherServlet - 名称为&#39; spring&#39;的DispatcherServlet处理[/avispring/404.html]的POST请求   DEBUG:org.springframework.web.servlet.DispatcherServlet - 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@16fffcf],名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 查找路径/404.html的处理程序方法   DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 找到1个符合[/404.html]的匹配映射:[{[/ 404.html]}]   DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 返回处理程序方法[public org.springframework.web.servlet.ModelAndView com.avispring.controllers.HelloController.errorPage()]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 测试处理程序适配器[org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@511db5]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 测试处理程序适配器[org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1a86ee]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 测试处理程序适配器[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@c26a5f]   DEBUG:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - 使用参数[]调用[HelloController.errorPage]方法   DEBUG:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - 方法[errorPage]返回[ModelAndView:引用视图名称&#39; / 404&#39 ;;模型为空]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 渲染视图[org.springframework.web.servlet.view.JstlView:name&#39; / 404&#39 ;; DispatcherServlet中的URL [/WEB-INF/jsp//404.jsp]],名称为&#39; spring&#39;   DEBUG:org.springframework.web.servlet.view.JstlView - 使用名称&#39; / 404&#39;呈现视图使用模型{}和静态属性{}   DEBUG:org.springframework.web.servlet.view.JstlView - 转发到InternalResourceView&#39; / 404&#39;中的资源[/WEB-INF/jsp//404.jsp]   DEBUG:org.springframework.web.servlet.DispatcherServlet - 清除线程绑定请求上下文:org.apache.catalina.core.ApplicationHttpRequest@bb82df   DEBUG:org.springframework.web.servlet.DispatcherServlet - 已成功完成请求   DEBUG:org.springframework.web.context.support.XmlWebApplicationContext - 在WebApplicationContext中为命名空间发布事件&#39; spring-servlet&#39 ;: ServletRequestHandledEvent:url = [/ avispring / 404.html];客户= [0:0:0:0:0:0:0:1];方法= [POST];的servlet = [弹簧];会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54];用户= [零]。时间= [1毫秒];状态= [OK]   DEBUG:org.springframework.web.context.support.XmlWebApplicationContext - 在Root WebApplicationContext中发布事件:ServletRequestHandledEvent:url = [/ avispring / 404.html];客户= [0:0:0:0:0:0:0:1];方法= [POST];的servlet = [弹簧];会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54];用户= [零]。时间= [1毫秒];状态= [OK]

2 个答案:

答案 0 :(得分:6)

好的,这太令人沮丧了,我通过点击和试用找到了答案。对于所有面临我问题的人,我发布了我的解决方案。我不得不在我的web.xml文件中只更改一行。我不得不替换这段代码

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

使用此代码

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我在spring-security.xml文件中甚至不需要这一行

<security:intercept-url pattern="/j_spring_security_check" access="permitAll"/>

希望这对某人有所帮助。快乐的编码...

答案 1 :(得分:3)

您是否尝试设置$SPARK_HOME/conf元素的login-processing-url属性?我使用了与Spring和Spring Security相同的最新版本,并添加了<security:form-login>属性,如下所示:

login-processing-url

一切正常,我甚至不需要以下元素:

login-processing-url="/j_spring_security_check"

当然,如果您希望使用<security:intercept-url pattern="/j_spring_security_check" access="permitAll"/> 代替/login,您可以自由使用/j_spring_security_check。只需确保您在JSP和Spring Security配置文件中放置的URI匹配。

希望这会有所帮助......

杰夫

------------ UPDATE ------------

我考虑一下...... Spring Security在版本4中引入了跨站点请求伪造(CSRF)保护。当我更新我的代码时,为了避免在我所有受保护的JSP中添加CSRF管理(对我的业务来说不是必需的)需要),我必须在我的<security:http>元素中添加以下元素:

<security:csrf disabled="true"/>

请试一试,告诉我它是否有效。