Перенаправление Spark-java — браузер не перенаправляет

Итак, я пытаюсь следовать документации 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, поэтому добавил в начало основной функции следующую строку кода:

staticFileLocation("/public");

Когда я ввожу правильный логин и пароль, я вижу в представлении сети в Chrome, что у меня есть GET-запрос со статусом 200, ОК, на 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");
    });

};
});

person kedar94    schedule 25.01.2016    source источник
comment
Я хотел бы добавить, что когда я отправляю сообщение, я получаю статус 302, а затем GET-запрос со статусом 200, но все же браузер (я пробовал Chrome и IE) ничего не делает...   -  person kedar94    schedule 26.01.2016


Ответы (2)


Что не так, так это то, что вы перенаправляете на HTML-страницу в конечной точке публикации, которая должна возвращать данные Json. Вы должны вернуть один json, если аутентификация прошла успешно или не удалось, например {"auth": "OK"} или {"auth": "NOK"}, и решить, куда перенаправить из Javascript на основе его информации.

person Laercio Metzner    schedule 26.01.2016
comment
Но почему я не могу этого сделать? Этот пост предназначен только для перехвата логина и пароля, и если он совпадает с логином и паролем, хранящимся в коллекции, я просто хочу загрузить новую страницу. Я не могу понять, почему я получаю нужную мне страницу на вкладке сети в Chrome со статусом GET 200, но браузер ничего не делает. - person kedar94; 26.01.2016
comment
Одностраничные приложения используют другой подход. То, что вы намеревались сделать, было полной загрузкой новой страницы, что было бы неуместно. Я мог бы объяснить лучше, если вы опубликуете свой код Javascript (или любой другой клиентский язык, который вы используете), который выполняет почтовый запрос в /users/login. Не могли бы вы обновить свой вопрос с ним? - person Laercio Metzner; 26.01.2016
comment
Конечно, я ставлю это в вопрос тела. Я создаю простое приложение в браузере, задача которого что-то делать, но сначала мне нужно войти в систему, чтобы попасть на эту страницу. - person kedar94; 26.01.2016
comment
Ваши обратные вызовы для успеха и ошибки должны объявлять параметр, что-то вроде }).success(function(res) {. Параметр res будет содержать информацию об ответе, включая статус http и атрибут res.data, который является ответом json от вашего сервера. Затем на основе этого ответа вы можете перенаправить на нужную страницу, в AngularJS вы можете использовать для этого службу определения местоположения, например $location.path('/index') - person Laercio Metzner; 26.01.2016
comment
Мне действительно нужно изменить код на стороне клиента? Следуя документации Spark, я не понимаю, почему res.redirect не перенаправляет меня на нужную страницу. - person kedar94; 26.01.2016
comment
Просто объявите параметр в обратном вызове успеха и отладьте его в своем браузере (F12 в Chrome). Поместите точку останова внутри обратного вызова успеха и посмотрите свойства объекта res. Вы получите это. Перенаправление сервера — не лучший выбор для одностраничных приложений. - person Laercio Metzner; 26.01.2016
comment
Спасибо за ваши предложения, однако по разным причинам мне приходится использовать перенаправление сервера, и я хочу понять, почему мой код не работает. - person kedar94; 26.01.2016

Это связано с тем, что res.redirect отправит в браузер http-заголовок перенаправления (значения состояния HTTP 301, 302, 303 и 307),

но браузер может перенаправлять только в get, НЕ работает в post или put или delete (проверено в chrome. Обратите внимание, что запрос на перенаправление был отправлен браузером, но страница просто не изменилась...).

Видеть:

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

person andyf    schedule 07.09.2016