【问题标题】:Weird redirect bug (POST redirect to same page does not update)奇怪的重定向错误(POST 重定向到同一页面不更新)
【发布时间】:2015-12-20 03:24:24
【问题描述】:

我目前有一个 POST 请求,无论如何都会在响应标头中设置位置以再次转到完全相同的页面。

1) 我点击登录。如您所见,位置设置为/,在本例中是同一页面。请求由服务器处理,然后在响应标头中设置通过位置字段的重定向。

2) 下面是与登录页面相同地址的获取请求(不要与仅接收带有登录凭据的帖子的/auth/local 混淆)。 /由于在节点中路由,登录时是不同的页面。

3) 正如您在下面看到的,预览显示了对 get 请求的响应的 html,该响应由 post 请求的响应发起。它与实际浏览器显示的初始登录页面不同。好像没有更新浏览器?

时间线:

我也在运行 Angular:

main.js

angular.module('myApp', [])
    .controller('publicHomeCtrl', ['$scope', '$http', function ($scope, $http) {
        $scope.submit = function (event) {
            var data = {
                email: $scope.email,
                password: $scope.password
            };
            $http.post('/auth/local', data).success(function () {
                console.log('success');
            });
            event.preventDefault();
        };
        $scope.submit2 = function () {
            var data = {
                email: $scope.email,
                password: $scope.password
            };
            $http.post('/auth/local', data).success(function () {
                console.log('success');
            });
        };
}]);

登录 html

<div class="container" data-ng-controller="publicHomeCtrl">
    <form method="post" role="form" ng-submit="submit($event)">
        <input type="email" data-ng-model="email" placeholder="your@email.here" class="form-control">
        <input type="password" data-ng-model="password" placeholder="password" class="form-control">
        <button type="submit" class="btn btn-success">sign in 1</button>
    </form>
    <button ng-click="submit2()">sign in 2</button>
</div>

我怀疑是因为我在客户端的 http.post 有一个回调,它取消了响应标头中的重定向,而不是实际更新视图?

【问题讨论】:

  • 这是浏览器页面中的表单帖子吗?如果是这样,您是否通过 Javascript 进行提交?如果是这样,您是否阻止了默认表单提交?如果您没有阻止默认设置,那么您的 ajax 提交表单,然后浏览器提交表单并且 ajax 响应丢失。我不知道这是否完全适用于您(这取决于我们看不到的客户端代码),但这是一个非常常见的错误(不会阻止只会导致页面重新加载的默认表单提交)。
  • 确实看起来您可能正在收到一个默认表单提交,它在处理您的 Ajax 响应之前重新加载页面。请参阅下面的答案以获取几种解决方案。
  • @jfriend00 用一种方法更新了代码以摆脱 preventDefault,似乎不起作用:/
  • 代码现在的样子,如果 event$ 参数是正确的事件,它需要是 event$.preventDefault();,而不是 event.preventDefault()。您是否完全确定您正在以正确的方式传递事件对象?我在这里看到了一些不同的东西:stackoverflow.com/questions/21101492/…
  • @jfriend00 还是一样:(

标签: html node.js http redirect http-headers


【解决方案1】:

不敢相信我们错过了这个。

当 ajax 调用返回 302 时,浏览器不会将当前页面更改为新位置。相反,它获取新位置的内容并将其返回给 Ajax 调用,这不是您想要的。

如果您希望浏览器页面在 ajax 调用后重定向,那么您必须自己在客户端的 ajax 响应处理程序中编写代码。我建议不要使用 302。只需返回一个正常的 200 并返回一些 JSON 来告诉客户端下一步该做什么。如果客户端收到执行重定向的指令,则它可以将window.location 本身设置为 JSON 中返回的新 URL。

【讨论】:

  • @KarlMorrison - 我完全改变了我的答案。看看你对这款新产品的看法。
  • 我在几分钟前就知道了,哈哈!谈时机!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多