【问题标题】:Spark-java redirect - browser does not redirectSpark-java 重定向 - 浏览器不重定向
【发布时间】:2016-05-01 18:18:24
【问题描述】:

好的,所以我尝试遵循 Spark 文档,我想在我的单页应用程序中执行简单的重定向。我的代码如下所示:

post("/users/login", (req, res) -> {
        ObjectMapper mapper = new ObjectMapper();
        User creation = mapper.readValue(req.body(), User.class);
        User user = userService.getUser(creation.getLogin());
        if (user.getPassword().equals(creation.getPassword())) {
            req.session().attribute("userid", creation.getLogin());
            System.out.println("OK");
            res.status(201);
            res.redirect("/index.html");
            return "";
        }
        System.out.println("BAD");
        return null;
    } , json());

基本上,我有三个静态 html 文件:registration.html、login.html 和 index.html。我阅读了有关 staticFileLocation 的内容,因此我在 main 函数的开头添加了以下代码行:

staticFileLocation("/public");

当我输入正确的登录名和密码时,我在 Chrome 的网络视图中发现我收到了状态为 200 的 GET 请求,OK,发往http://localhost:4567/index.html。但是,浏览器什么也不做,也不会将我重定向到该页面。你能告诉我我做错了什么吗?

编辑: 这是处理客户端登录的javascript代码:

app.controller('LoginUserCtrl', function($scope, $http) {
$scope.loginUser = {};
$scope.submitForm = function() {
    $http({
        method : 'POST',
        url : 'http://localhost:4567/users/login',
        data : $scope.loginUser,
        headers : {
            'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
        }
    }).success(function() {
        console.log("User logged successfully");
        console.log($scope.loginUser);
    }).error(function() {
        console.log("Unknown error while logging user");
    });

};
});

【问题讨论】:

  • 我想补充一点,当我发送帖子时,我得到状态 302,然后 GET 状态为 200 的请求,但仍然浏览器(我尝试过 Chrome 和 IE)什么都不做......

标签: http redirect single-page-application http-redirect spark-java


【解决方案1】:

这是因为 res.redirect 会向浏览器发送一个重定向 http 头(HTTP 状态值 301、302、303 和 307),

但是浏览器只能在get 中重定向,不能在post 或put 或delete 中工作(在chrome 中测试。请注意,浏览器发送了重定向请求,但页面没有改变。 ..)。

见:

http://www.alanflavell.org.uk/www/post-redirect.html

【讨论】:

    【解决方案2】:

    问题在于,您正在重定向到应该返回 Json 数据的 post 端点中的 HTML 页面。如果身份验证成功或失败,您必须返回单个 json,例如 {"auth": "OK"} 或 {"auth": "NOK"},并根据其信息决定从 Javascript 重定向到何处。

    【讨论】:

    • 但是为什么我不能这样做呢?这篇文章只是为了捕捉登录名和密码,如果它与集合中存储的登录名和密码匹配,我只想加载新页面。我不明白为什么我在 Chrome 的网络选项卡中得到一个我想要的页面,状态为 GET 200,但浏览器什么也没做。
    • 单页应用程序遵循不同的方法。你打算做的是一个完整的新页面加载,这是不合适的。如果您发布向 /users/login 发出发布请求的 Javascript(或您使用的任何客户端语言)代码,我可以更好地解释。你能用它更新你的问题吗?
    • 当然,我把它放在了正文中。我正在浏览器中构建一个简单的应用程序,它的任务是做某事,但首先我需要登录才能访问此页面。
    • 您对成功和错误的回调必须声明一个参数,例如}).success(function(res) {。 res 参数将包含有关响应的信息,包括 http 状态和 res.data 属性,这是来自您的服务器的 json 响应。然后,基于此响应,您可以重定向到所需的页面,在 AngularJS 中,您可以使用定位服务,例如 $location.path('/index')
    • 我真的需要修改客户端代码吗?按照 Spark 文档,我不明白为什么 res.redirect 不会将我重定向到想要的页面。
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2011-11-02
    相关资源
    最近更新 更多