1

我的 RestEasy 代码向 angularjs 控制器发送 303 响应。此外,Chrome 网络调试显示接收到 HTTP 303 并加载了新 URL(显示为 HTTP 200) - 但从未显示!

如果我尝试直接从浏览器调用 RestEasy-endpoint,它将很好地重定向!

但是,唉,我的 angularjs 控制器似乎无法更新浏览器 - 它仍然放在同一页面上!

这是我的 angularjs 控制器:

var mod = angular.module('login', []);
mod.controller('RestController', [
        '$http',
        '$scope',
        function($http, $scope) {

            $scope.submit = function(v1, v2) {
              $http.post("rest/login/submit", {
                  param1 : v1,
                  param2    : v2
                }).success(function(data, status, headers, config) {
                    $scope.submitmsg = "";

            }).error(function(data, status, headers, config) {
                $scope.submitmsg = "Error...";
            });
        }
    } ]);

我的问题很简单:我应该做一些特别的事情来处理浏览器页面的更新。也许设置一些 $scope 变量或 $doc 什么的?或者我应该在函数的 error() 部分进行一些处理 - 以解决 303 代码?

任何帮助表示赞赏。所有测试均在 Chrome 中完成。

4

2 回答 2

1

303 响应代码不应该真正用于单页应用程序。它在 Angular 框架之前由浏览器处理。

您应该返回适​​当的错误代码而不是 3xx 重定向命令;服务器错误时为 5xx,未经授权时为 401,依此类推。

如果这应该是全局异常处理程序或仅在特定于控制器中,则实际上取决于因此应采取的措施。根据可用的信息,我会向应用程序推荐一个全局处理程序,它将使用$location.path("...");重定向用户。

于 2014-12-12T18:14:56.510 回答
1

从端点发送 HTTP 303 不是一个好主意。我认为它可能被浏览器拦截。更好的选择是返回有关您要重定向到的 URL 的信息(以及适当的 HTTP 响应 - 可能是 200 或 400 或其他)并使用 $window.location.href 执行重定向:

var mod = angular.module('login', []);
mod.controller('RestController', [
        '$http',
        '$scope',
        '$window',
        function($http, $scope,$window) {

            $scope.submit = function(v1, v2) {
              $http.post("rest/login/submit", {
                  param1      : v1,
                  param2    : v2
                }).success(function(data, status, headers, config) {
                    $window.location.href = "http://host:port/path"
                }).error(function(data, status, headers, config) {
                    $scope.submitmsg = "error";
                });
            }
        } ]);
于 2014-12-13T09:08:47.157 回答