post方法渲染403禁止页面而不是执行post方法代码
Posted
技术标签:
【中文标题】post方法渲染403禁止页面而不是执行post方法代码【英文标题】:post method rendering 403 forbidden page instead of executing post method code 【发布时间】:2017-12-14 12:50:00 【问题描述】:注意:我是 Play 框架的新手
使用这个video tutorial and playlist,我设法创建了一个简单的网络应用程序。
问题:
路由文件中的POST
方法似乎没有执行所需的 POST 代码。
给定下面的路由文件,浏览到localhost:port/user/register
请求GET
,从而渲染并返回register view
。
填写register view
字段,然后单击submit
,刷新页面(通过清除输入字段)并显示预期的“注册”文本
如果method="post"
已添加到register view
中的form
,则会立即显示403 Forbidden page
页面。
为什么没有显示“注册”文本,我错过了什么(做错了)?
路线文件:
GET / controllers.HomeController.index
GET /user controllers.LoginController.index()
GET /user/login controllers.LoginController.login()
POST /user/login controllers.LoginController.doLogin()
GET /user/register controllers.LoginController.register()
POST /user/register controllers.LoginController.doRegister()
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
控制器:
HomeController
LoginController
LoginController 方法:
public Result index() return ok(views.html.user.index.render(User.getAllUsers()))
public Result login() return ok(login.render());
public Result doLogin() return ok("registered");
public Result register() return ok(register.render());
public Result doRegister() return ok("registered");
注册查看:
@()
<html>
<head>
<title>Register new User</title>
</head>
<body>
<h1>Register User</h1>
<br>
<br>
Enter Email Address: <input type="password" name="confirmPassword">
Enter Password: <input type="password" name="confirmPassword">
Confirm Password: <input type="password" name="confirmPassword">
<br>
<br>
<form action="@routes.LoginController.doRegister()">
<input type="submit" value="Register"/>
</form>
</body>
</html>
控制台输出错误:
[warn] p.filters.CSRF - [CSRF] Check failed because no or invalid token found in body
[warn] p.filters.CSRF - [CSRF] Check failed with NoTokenInBody
【问题讨论】:
【参考方案1】:我认为您是正确的,您需要定义提交表单数据时要使用的 HTTP 方法(GET 或 POST)。
您可能会看到Forbidden
,因为“默认情况下,Play 将需要 CSRF 检查”See here?
像这样将 CSRF 令牌添加到请求中:
@import helper._
<form method="post" action="@CSRF(routes.LoginController.doRegister())">
...
或者在表单的正文中:
<form method="post" action="@routes.LoginController.doRegister()">
@CSRF.formField
...
【讨论】:
我对这个主题(过滤器等)进行了广泛的阅读,以更好地了解导致问题的原因。我在文档中注意到,有一个选项可以禁用特定路由的 CSRF 检查。这是通过将`+ nocsrf` 放在一个路由文件中的post
路由上方来完成的(对于每个post
方法,都需要绕过CSRF 过滤器。我将应用您建议的方法来包含和使用CRSF 过滤器,因为它有点模糊。谢谢!
@KGCybeX 确实有效 - 但它是一种解决方法,它消除了 CSRF 提供的安全性。如果您曾经部署过,请务必将 CSRF 令牌放入其中以检查您是否正在执行敏感的 POST。以上是关于post方法渲染403禁止页面而不是执行post方法代码的主要内容,如果未能解决你的问题,请参考以下文章
禁止 403:Firefox 中的 CSRF 验证失败错误,而不是 chrome
Cordova POST - 请求禁止 403。未到达 Dispatcher Servlet
POST http://127.0.0.1:8000/follow/fav/8/1/ 403(禁止)[重复]