post方法呈现403禁止页面而不是执行post方法代码

时间:2017-07-10 17:07:26

标签: scala playframework playframework-2.0 sbt

注意:我是Play Framework新手

使用此video tutorial and playlist,我设法创建一个简单的Web应用程序。

问题:

路径文件中的

POST方法似乎不执行所需的POST代码。

根据下面的路线文件,浏览到localhost:{port}/user/register请求GET,从而呈现并返回register view

填写register view字段,然后点击submit,刷新页面(通过清除输入字段)并显示预期的"已注册"文本

如果已将method="post"添加到form中的register view,则会显示即时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 个答案:

答案 0 :(得分:6)

我认为你是正确的,你需要定义在提交表单数据时使用的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
    ...