获取错误为org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported

时间:2015-08-10 10:55:58

标签: java spring-mvc spring-security

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

当iam运行应用程序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

修改 的login.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>

我已经在堆栈溢出中读到了一些答案,但是dint找到了解决方案。

有人可以帮助我。

4 个答案:

答案 0 :(得分:1)

感谢@JohnnyAW建议在网上做更多的R&amp; D,我找到了在登录页面中实现CSRF令牌所需的答案。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我在将一个角度应用程序与Spring集成时遇到了类似的问题。想在这里分享修复作为答案,以帮助未来的读者。

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

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

要解决此问题,我刚刚在角度应用中更改了服务调用,如下所示,并且有效。

http.request(this.loginUrl, options);

答案 3 :(得分:0)

在行动中使用CSRF令牌-

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

希望这会起作用。