得到错误作为 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的主要内容,如果未能解决你的问题,请参考以下文章
Spring Batch:Hibernate 打印 SQL 查询和所用时间
@PreAuthorize 不起作用 - 是不是存在无法解析的循环引用?
得到错误作为 org.springframework.web.servlet.PageNotFound handleHttpRequestMethodNotSupported