好的,所以我尝试遵循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的网络视图中找到了我已获得状态为200的GET请求,确定为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");
});
};
});
答案 0 :(得分:1)
错误的是,您要重定向到应该返回Json数据的后端点中的HTML页面。如果身份验证成功或失败,您必须返回单个json,例如{"auth": "OK"}
或{"auth": "NOK"}
,并根据其信息决定从Javascript重定向到何处。
答案 1 :(得分:1)
这是因为res.redirect会向浏览器发送重定向http标头(HTTP状态值301,302,303和307),
但是浏览器只能在get
中重定向,而不能在post
或put
或delete
中工作(在Chrome中测试过。请注意,浏览器发送了重定向请求,但页面没有改变......)。
请参阅: