得到错误作为 org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported

Posted

技术标签:

【中文标题】得到错误作为 org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported【英文标题】:Getting Error as org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported 【发布时间】:2015-11-02 06:13:05 【问题描述】:

我已经按照链接Example Link 创建了登录应用程序。我没有在项目中使用过 maven。

当我在运行应用程序时http://localhost:9889/SpringMVCDemo/login

被重定向到下面的链接

http://localhost:9889/SpringMVCDemo/j_spring_security_check

我收到以下错误。

在控制台中我收到以下错误消息

INFO: Server startup in 18487 ms
Aug 10, 2015 4:07:54 PM org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported
WARNING: Request method 'POST' not supported

在浏览器中

HTTP Status 405 - Request method 'POST' not supported
type Status report

message Request method 'POST' not supported

description The specified HTTP method is not allowed for the requested resource.

Apache Tomcat/8.0.24

编辑: 登录.jsp

<html>
<head><title>Login</title></head>
<body>
 <h1>Login</h1>
 <form name='f' action="j_spring_security_check" method='POST' >
    <table>
       <tr>
          <td>User:</td>
          <td><input type='text' name='username' value=''></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input type='password' name='password' /></td>
       </tr>
       <tr>
          <td><input name="submit" type="submit" value="submit" /></td>
       </tr>
    </table>
</form>
</body>
</html>

弹簧安全

<?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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">


   <http use-expressions="true">
       <intercept-url pattern="/" access="isAnonymous()" />
       <intercept-url pattern="/welcome" access="isAnonymous()" />
       <intercept-url pattern="/login" access="isAnonymous()" />
       <intercept-url pattern="/logout" access="isAnonymous()" />


       <intercept-url pattern="/userInfo"
           access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />
       <intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
       <intercept-url pattern="/other/**" access="isAuthenticated()" />

       <access-denied-handler error-page="/403" />

       <form-login login-page='/login' login-processing-url="/j_spring_security_check"
           default-target-url="/userInfo" always-use-default-target="false"
           authentication-failure-url="/login?error=true" username-parameter="username"
           password-parameter="password" />

       <logout logout-url="/logout" logout-success-url="/logoutSuccessful"
           delete-cookies="JSESSIONID" invalidate-session="true" />

   </http>

   <authentication-manager>
       <authentication-provider>
           <user-service>
               <user name="user1" password="12345" authorities="ROLE_USER" />
               <user name="admin1" password="12345" authorities="ROLE_USER, ROLE_ADMIN" />
           </user-service>
       </authentication-provider>



       <!-- authentication from database -->
       <authentication-provider>
           <jdbc-user-service data-source-ref="myDataSource"
               users-by-username-query="select username,password, enabled from users where username=?"
               authorities-by-username-query="select username, role from users where username=?" />
       </authentication-provider>

   </authentication-manager>

</beans:beans>

我在堆栈溢出中阅读了一些答案,但没有找到解决方案。

谁能帮帮我。

【问题讨论】:

错误信息显示,您只能向j_spring_security_check 发送“GET”请求。那么问题到底是什么?你如何让j_spring_security_check 接受“POST”或如何在那里发送“GET”? 我怀疑我们需要做些什么改变才能让它发挥作用。 ? 【参考方案1】:

感谢@JohnnyAW 建议通过这样做在网上做更多的研发,我找到了我们需要在登录页面中实现 CSRF 令牌的答案。

当我在登录页面中添加上述行时,它可以正常工作。

【讨论】:

【参考方案2】:

最简单的方法是将登录表单中的请求方法更改为“GET”。在loginPage.jsp 中更改如下形式:

<form name='f' action="j_spring_security_check" method='GET'>

编辑:实际上您不想将登录请求作为“GET”请求发送,因为您可以在日志文件中看到凭据。可以用于测试目的,但在某些时候您会希望将请求更改为“POST”

【讨论】:

是的,早些时候我尝试过从 POST 更改为获取,但仍然出现错误 2015 年 8 月 10 日下午 4:52:49 org.springframework.web.servlet.PageNotFound noHandlerFound 警告:未找到映射对于名称为“mvc-dispatcher”的 DispatcherServlet 中带有 URI [/SpringMVCDemo/j_spring_security_check] 的 HTTP 请求,我不想从 POST 更改为 GET,因为凭据将在浏览器中可见。 还是 405? “PUT”是怎么回事? HTTP 状态 404 - 类型状态报告消息描述 请求的资源不可用。 -------------------------------------------------- ------------------------------ 等等,'GET' 得到 404 吗?顺便提一句。您在浏览器中看不到凭据,仅在服务器上的访问日志中。发布您的 login.jsp 和 spring-security.xml 当我使用 GET 时,我可以在浏览器中看到凭据。并得到 404 错误。【参考方案3】:

我在将 Angular 应用程序与 Spring 集成时遇到了类似的问题。考虑在此处分享修复作为答案,以帮助未来的读者。

根据post here,我在 Spring Security 中启用了基本身份验证并尝试从 Angular 应用程序发出登录请求。

http.post(this.loginUrl, , options);

由于基本身份验证不接受 POST 方法,出现以下错误,

Aug 30, 2017 5:47:30 PM org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported
WARNING: Request method 'POST' not supported

为了解决这个问题,我刚刚更改了 Angular 应用程序中的服务调用,如下所示,它起作用了。

http.request(this.loginUrl, options);

【讨论】:

【参考方案4】:

在行动中使用 CSRF 令牌 -

<form name='f' action="j_spring_security_check?$_csrf.parameterName=$_csrf.token" method='POST' >

希望这会奏效。

【讨论】:

以上是关于得到错误作为 org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported的主要内容,如果未能解决你的问题,请参考以下文章

无法确定“oracle”的方言

Spring Batch:Hibernate 打印 SQL 查询和所用时间

springboot+solr基本使用

@PreAuthorize 不起作用 - 是不是存在无法解析的循环引用?

spring拦截器(interceptor)简介

得到错误作为 org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported