我的 POST ajax 请求在 Laravel 控制器上返回 302

Posted

技术标签:

【中文标题】我的 POST ajax 请求在 Laravel 控制器上返回 302【英文标题】:My POST ajax request returns 302 on a Laravel Controller 【发布时间】:2018-02-15 22:15:55 【问题描述】:

我向 Laravel 控制器发送了一个 POST Ajax 请求,但我收到了 302 Found 响应代码。

控制器是 Laravel 的 Auth 包提供的ForgotPasswordController,所以没什么特别的。

它的构造函数中有来宾中间件,我发现如果我从构造函数中删除这个中间件,Ajax 请求就会正常工作(它返回 200 响应代码)。

Ajax 请求有 X-CSRF-TOKENX-XSRF-TOKEN 标头,所以我认为没有缺少什么。

我正在使用 Axios 库从 VueJS 密码重置表单发送此 Ajax 请求。

如果控制器有来宾中间件,为什么我的 POST 请求不起作用?

这是随请求发送的标头:

POST /password/email HTTP/1.1  
Host: myapp.dev  
Connection: keep-alive  
Content-Length: 37  
Pragma: no-cache  
Cache-Control: no-cache  
Origin: http://myapp.dev  
X-XSRF-TOKEN: eyJpdiI6IjRqTk1yTXFsXC9FVlRzckF0dUM4azdRPT0iLCJ2YWx1ZSI6IjY0MUZzaEpCTXJDcUhzUGhcL2dzYVJmalQrR3pwV3IzYWxiTSt4dVwvN2VVKzJ4b2t3XC9GcVhJcllmK3pQYVV4VGFIZG4wZ0s3NlNCTG01WEl6YzBCY2NRPT0iLCJtYWMiOiIwYmNjOTRiZGJjZTM2YjYyMWJiMzRhNTlkOTkwOWU4Y2M4NmYzYzI5NjhiMTU4MDdiMGJkMmJhYmMwODEzMDhjIn0=  
X-CSRF-TOKEN: nejsetydvFWgeqppZc5XQtX04b5AdXlsTKSgaydj  
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)  
 AppleWebKit/537.36 (Khtml, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Content-Type: application/json;charset=UTF-8  
Accept: application/json, text/plain, */*  
X-Requested-With: XMLHttpRequest  
Referer: http://myapp.dev/password  
Accept-Encoding: gzip, deflate  
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4  
Cookie: XSRF-TOKEN=eyJpdiI6IjRqTk1yTXFsXC9FVlRzckF0dUM4azdRPT0iLCJ2YWx1ZSI6IjY0MUZzaEpCTXJDcUhzUGhcL2dzYVJmalQrR3pwV3IzYWxiTSt4dVwvN2VVKzJ4b2t3XC9GcVhJcllmK3pQYVV4VGFIZG4wZ0s3NlNCTG01WEl6YzBCY2NRPT0iLCJtYWMiOiIwYmNjOTRiZGJjZTM2YjYyMWJiMzRhNTlkOTkwOWU4Y2M4NmYzYzI5NjhiMTU4MDdiMGJkMmJhYmMwODEzMDhjIn0%3D; laravel_session=eyJpdiI6IkJnczRHV3NcLzhLbzZWaUlvTTI2cFlBPT0iLCJ2YWx1ZSI6IkpQYytLXC9pQ1R3MTZlaEx2QWJ4bGpSd21BV25jelJKVDJkQVdcL25GSG4rQkpQc1duZHIrTjErOGt3bk5BVVVcL3FTK1c2XC83Y1NqTmxBaVZ1bkQ2TWV5Zz09IiwibWFjIjoiNzg4Y2UyNWQ0ODcxMWNkNWE3MmU4ZDY1MmIyNTE0NDgwMzFmM2ZjYzkxMzM5ZGM5ZTk5MDI4NjE4OGRkNmJjYyJ9

【问题讨论】:

尝试在请求中添加 _token 字段以包含您的令牌 我不应该那样做。因为CSRF令牌是Axios在Ajax Request中作为header添加的。 是的,我知道。但请务必检查一下 我试过了,还是不行 好的,我发现在我的情况下我不发送 X-CSRF 令牌。只有 X-XSRF 和 _token 作为参数。 【参考方案1】:

好的,我发现...只是我在执行这些请求时通过了身份验证。所以来宾中间件正在重定向我……真丢脸!

【讨论】:

【参考方案2】:

302 响应通常是因为您的请求被 laravel 重定向。如果您期望 json 响应,请不要忘记在您的标头请求中添加 Accept: 'application/json',然后您会看到实际错误

【讨论】:

我在我的问题中添加了随请求发送的标头【参考方案3】:

您必须仔细查看您的控制器。你必须返回json。还要查看浏览器中的网络控制台。如果响应代码是 302,则有一个位置。因此,如果一个位置是登录页面 - 验证未在中间件中传递

【讨论】:

是的,有一个Location,它是控制器中设置的重定向路径。问题确实在中间件内部。我不明白为什么中间件会把我踢出去...... 通常我会在 ajax 请求中包含 _token 字段。该字段必须包含您的令牌

以上是关于我的 POST ajax 请求在 Laravel 控制器上返回 302的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 的 Ajax Post 请求中缺少参数

仅在 HTTPS 中执行 ajax POST 请求时,Laravel 403 错误(生产)

Laravel 5 App - AJAX Post请求不接受令牌并抛出500内部服务器错误

Laravel 5.1 AJAX - 即使我发送 POST 请求,也不允许返回 405 GET 方法

如何在 Laravel 中使用 jQuery ajax 请求自动添加 X-CSRF-TOKEN

Laravel:为啥我的 ajax 请求返回“500(内部服务器错误)”?