Spring Security登录返回404

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

这是我的web.xml cod e

  avispring  404 /404.html   contextConfigLocation /WEB-INF/spring-database.xml   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy    springSecurityFilterChain /admin/*   org.springframework.web.context.ContextLoaderListener   spring  org.springframework.web.servlet.DispatcherServlet  1   spring /  

这是我的春季安全码:

                  

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

 <form action="" method="post"> 

和控制台输出是

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

注意:

  1. 我使用的是spring 4.2.1和spring security 4.0.2
  2. 大多数论坛都指向上下文路径,即[appname / login][appname / j_spring_security_check] ,我认为我的相关

请帮忙…

更新:

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

DEBUG:org.springframework.web.servlet.DispatcherServlet – 绑定到线程的请求上下文:org.apache.catalina.connector.RequestFacade@c8b445 DEBUG:org.springframework.web.servlet.DispatcherServlet – 名为’spring’的DispatcherServlet处理POST请求for [/ avispring / login] DEBUG:org.springframework.web.servlet.DispatcherServlet – 在名为’spring’DEBUG的DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@16fffcf]: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping – 查找路径/登录的处理程序方法DEBUG:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping – 没有为[/找到处理程序方法登录] DEBUG:org.springframework.web.servlet.DispatcherServlet – 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@138f01b],名称为’spring’DEBUG:org.springframework.web.servlet.h andler.BeanNameUrlHandlerMapping – 找不到[/ login] DEBUG的处理程序映射:org.springframework.web.servlet.DispatcherServlet – 在名为’spring’的DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@1ff154c] DEBUG:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping – 找不到[/ login] WARN的处理程序映射:org.springframework.web.servlet.PageNotFound – 找不到带有URI [/ avispring / login]的HTTP请求的映射DispatcherServlet,名称为’spring’DEBUG:org.springframework.web.servlet.DispatcherServlet – 清除线程绑定请求上下文:org.apache.catalina.connector.RequestFacade@c8b445 DEBUG:org.springframework.web.servlet.DispatcherServlet – 已成功完成request DEBUG:org.springframework.web.context.support.XmlWebApplicationContext – 在WebApplicationContext中发布名称空间’spring-servlet’的事件:ServletRequestHandledEvent:url = [/ avispring / login]; 客户= [0:0:0:0:0:0:0:1]; 方法= [POST]; 的servlet = [弹簧]; 会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54]; 用户= [零]。 时间= [3毫秒]; status = [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毫秒]; status = [OK] DEBUG:org.springframework.web.servlet.DispatcherServlet – 绑定到线程的请求上下文:org.apache.catalina.core.ApplicationHttpRequest@bb82df DEBUG:org.springframework.web.servlet.DispatcherServlet – DispatcherServlet with name’ spring’处理[/avispring/404.html]的POST请求DEBUG:org.springframework.web.servlet.DispatcherServlet – 在DispatcherServlet中测试处理程序映射[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@16fffcf]名为’spring’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.controll ers.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 – 使用arguments []调用[HelloController.errorPage]方法DEBUG:org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod – Method [errorPage]返回[ModelAndView:引用名为’/ 404’的视图; model is null] DEBUG:org.springframework.web.servlet.DispatcherServlet – 渲染视图[org.springframework.web.servlet.view.JstlView:name’/ 404′; DispatcherServlet中的URL [/WEB-INF/jsp//404.jsp]],名称为’spring’DEBUG:org.springframework.web.servlet.view.JstlView – 使用模型{}和静态渲染名称为’/ 404’的视图attributes {} DEBUG:org.springframework.web.servlet.view.JstlView – 转发到InternalResourceView’/ 404’DEBUG中的资源[/WEB-INF/jsp//404.jsp]: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中命名空间’spring-servlet’:ServletRequestHandledEvent:url = [/ avispring / 404.html]; 客户= [0:0:0:0:0:0:0:1]; 方法= [POST]; 的servlet = [弹簧]; 会话= [BC0FB7E62DC0AFABD8EF72B8BF1CED54]; 用户= [零]。 时间= [1毫秒]; status = [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]

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

  springSecurityFilterChain /admin/*  

用这个代码

  springSecurityFilterChain /*  

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

  

希望可能对某人有所帮助。 快乐的编码……

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

 login-processing-url="/j_spring_security_check" 

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

  

当然,如果你想使用/login而不是/j_spring_security_check ,你可以自由地使用/login 。 只需确保您在JSP和Spring Security配置文件中放置的URI匹配即可。

希望这会有所帮助……

杰夫

———— UPDATE ————

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

  

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