为什么我的路线绕过 POST 并在 Play 2.4.6 中变成 GET

Why is my route bypassing a POST and turning into a GET in Play 2.4.6

我运行玩2.4.6

我的路线文件中有以下内容:

POST        /register      controllers.Auth.saveRegistration()

问题:

我有一个表单可以使 POST 到 /register 有效负载,这在本地和暂存时都可以正常工作。但是在生产中会生成后续的 GET 请求。

我通过覆盖 Global::onRouteRequest && Global::onRequest

将所有路由和操作方法记录到我的记录器中

生产日志:

[info] application - [AUTH] Create::personalInfo() accessed for session
[info] application - [ROUTE] /register POST 
[info] application - [ROUTE] actionMethod.name = saveRegistration()
[info] application - [ROUTE] /register GET

暂存日志:

[info] application - [AUTH] Create::personalInfo() accessed for session
[info] application - [ROUTE] /register POST
[info] application - [ROUTE] actionMethod.name = saveRegistration()
[info] application - [AUTH] Call Auth::saveRegistration
[info] application - [AUTH] Person::createOrUpdate creating new user
[info] application - [AUTH] Calling Auth::saveRegistration::AuthActions::loginPerson()
[info] application - [AUTH] Auth::saveRegistration::redirect to /myfavoriteroute

其他上下文

如果 saveRegistrationMethod() 被调用,当它被执行时,那么它 应该 写的第一件事应该是 Call Auth::saveRegistration

这意味着 saveRegistrationMethod() 从未在生产环境中被调用 ,而是生成一个 GET 请求。

此外:浏览器显示响应代码 303 - 此处附有响应

HTTP/1.1 303 See Other
Server: Cowboy
Connection: keep-alive
Vary: Accept-Encoding
Location: https://www.----.com/register
Content-Length: 20
Content-Encoding: gzip
Content-Language: en-US
Access-Control-Allow-Origin: *
Date: Mon, 01 Aug 2016 18:18:51 GMT
Via: 1.1 vegur

此外:在 Heroku 上使用 SBT_CLEAN=True 构建 - 在构建日志中验证..

问题:

什么会导致 POST 生成 GET,什么会导致这些环境差异?

您的应用程序似乎正在接收 POST 请求,然后将 303 重定向发送回浏览器,可能发送给它自己,也可能发送给其他资源,这些资源可能会被重定向返回,根据 HTTP 规范,浏览器正在发出 GET 请求,因为浏览器在收到 303 重定向后不允许发出 POST 请求,它们必须切换到 GET。

无论如何,您需要做的是在您的浏览器网络控制台中查看请求链是什么。如果浏览器收到返回第一个 POST 的 303 响应,它被重定向到的位置 header 是什么?顺便说一句,Play 中没有任何东西会自动生成 303 重定向,也许您有一些您不知道的正在重定向的过滤器。