发布方法渲染403禁止页面而不是执行发布方法代码 [英] post method rendering 403 forbidden page instead of executing post method code

查看:100
本文介绍了发布方法渲染403禁止页面而不是执行发布方法代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:我是Play框架的新手

使用此视频教程和播放列表,我设法创建了一个简单的网络应用.

Using this video tutorial and playlist, I manage to create a simple webapp.

问题:

POST方法似乎未执行所需的POST代码.

POST methods in routes file do not seem to execute the required POST code.

给出下面的路由文件,浏览到localhost:{port}/user/register请求一个GET,从而呈现并返回register view.

Given the routes file below, browsing to localhost:{port}/user/register requests a GET, thus rendering and returning the register view.

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

Filling in the register view fields, and clicking submit, refreshes the page (by clearing the input fields) and does show the expected "registered" text

如果register view中的form中已添加method="post",则会立即显示403 Forbidden page页面.

If method="post" has been added to the form in the register view, an immediate 403 Forbidden page page is displayed.

为什么没有显示已注册"文本,我缺少了什么(做错了?)?

Why isn't the "registered" text being shown, what am I missing (doing wrong) ?

路由文件:

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方法:

LoginController methods:

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

推荐答案

我认为您是对的,您需要定义提交表单数据时要使用的HTTP方法(GET或POST).

I think you're correct you need to define the HTTP method (GET or POST) to be used when submitting the form data.

您可能会看到Forbidden,因为默认情况下,Play需要进行CSRF检查"

It's possible you're seen Forbidden because "By default, Play will require a CSRF check" See here?

将CSRF令牌添加到请求中,如下所示:

Add the CSRF token to the request like this:

@import helper._

 <form method="post" action="@CSRF(routes.LoginController.doRegister())">
    ...

或在表单主体中:

<form method="post" action="@routes.LoginController.doRegister()">
    @CSRF.formField
    ...

这篇关于发布方法渲染403禁止页面而不是执行发布方法代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆