我正在尝试执行以下操作:
来自客户
var req = jQuery.post(
"http://www.example.com:3000"+"/dologin",
{"username" : username, "password" : password}).error(function(){
alert("an error occurred");
});
快递根
app.post('/dologin',function(req, res) {
res.redirect('http://bbc.co.uk');
});
结果传回
<p>Moved Temporarily. Redirecting to <a href="http://bbc.co.uk">http://bbc.co.uk</a></p>
似乎如果我从jquery发帖,重定向将无效。有没有人知道强迫它重定向的方法?
答案 0 :(得分:19)
浏览器不会在ajax响应的重定向上重定向窗口。使用javascript重定向浏览器。
例如,在服务器中将新网站作为内容发送。
res.contentType('application/json');
var data = JSON.stringify('http://site.example.com/')
res.header('Content-Length', data.length);
res.end(data);
在客户端
var req = jQuery.post(
"http://www.mysite.com:3000"+"/dologin",
{"username" : username, "password" : password}, 'json').error(function(){
alert("an error occurred");
}).success(function(data) {
window.location = data;
});
答案 1 :(得分:15)
我在开发应用时遇到了同样的问题。如果方法发布,Express似乎不会重定向。
尝试:
app.post('/dologin',function(req, res) {
req.method = 'get';
res.redirect('http://bbc.co.uk');
});
答案 2 :(得分:0)
使用OAuth2时,我正在做这样的事情。我有一个指向我的某个网页的链接,而这又会重定向到谷歌。
要重定向到其他位置,以下代码执行实际重定向
app.get('/GoogleRequestAuthorization.html',function(req,res) {
.
.
.
.
res.writeHead(302, {location: url});
res.end();
});
url是您要重定向到的地址。
完整功能是......
答案 3 :(得分:0)
我遇到了类似的问题,并通过检查请求的类型来解决它。在我的情况下,我使用JSON,但它也适用于其他POST请求:
var ajax = req.xhr;
if(ajax) {
res.status(401).json({'msg':'redirect','location':'/login'});
}
else {
req.method = 'get';
res.status(401).redirect('/login');
//Or if you prefer plain text
//res.status(333).send("Redirect");
}
它处理Ajax POST和AJAX以及标准GET请求。 在客户端上,在Ajax中驻留回调:
$.ajax({
type: 'POST',
data: Msg,
url: '/some/post',
dataType: 'JSON'
}).success(function(data, textStatus, req ) {
if(data.msg==="redirect") window.location = data.location;
else {...}
}).error(function(data, textStatus, req) {
if(req=="Unauthorized") {
alert("Unauthorized!");
window.location = "/login";
} else if (data.responseJSON.msg==="redirect") window.location = data.responseJSON.location;
else {
//...
}
});
实际上你可以在这里处理更多的状态,除了302之外,它会自动跟随JQuery,你从你想要重定向到的页面得到200作为响应。所以我避免发送302,在我的情况下发送401,或任何其他状态,例如333,这将被视为错误。