【问题标题】:Node authorization and redirect using AJAX post使用 AJAX 发布节点授权和重定向
【发布时间】:2013-11-03 08:31:11
【问题描述】:

我正在使用节点并在他授权后尝试重定向客户端。出于这个原因,我在客户端使用 ajax 的 POST 方法,其形式如下:

$.ajax({
    type: "POST",
    url: '/login',
    dataType: "json",
    async: false,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password));
    },
    data: credentials,
    success: function () {
        window.alert("Success! (whatever that means)");
    }
});

然后在服务器端,我尝试使用命令重定向到实际页面

app.get('/login', loginInternalApp);
app.post('/login', function (req, res){
    var postContents = req.body;
    req.session.username = postContents.username;
    res.redirect('/my_secret_page');
});
app.get('/my_secret_page', checkAuth, function (req, res) {
    console.log("sending the message!");
    res.send('if you are viewing this page it means you are logged in');
    res.end();
});

checkAuth 取自这里 how to implement login auth in node.js(我使用的是用户名而不是 user_id;这不是问题)。

也许我不知道如何正确处理这个 ajax 调用。我打印了一些控制台消息,服务器一直到 res.send('如果您正在查看此页面...') 但是,客户端上没有任何反应。然后,当我按下 control-C 来终止服务器时,会弹出警报窗口。同时,我可以看到成功传递的函数可以有参数(现在猜测:errorCode,errorString,otherData,也许更多)。

那我做错了什么?

【问题讨论】:

    标签: ajax node.js session post


    【解决方案1】:

    这里的问题是您对 JavaScript 驱动的导航和直接服务器请求-响应驱动的导航的概念有些混淆。让我们来看看它是否更有意义。

    您正在使用 ajax 提交您的登录表单,这意味着您停留在您所在的页面上,并且只需使用 JavaScript 提交您的 http 请求,并收集响应。您设置了POST,并且您的服务器将用户登录,然后返回一个3XX 指示重定向。您的 JavaScript 收集响应,如果您在“网络”选项卡下打开检查器,您可以看到响应。但是该页面不会去任何地方,因为您只是在使用 JavaScript 收集您的响应。

    在这种情况下,您可以选择其中一种——使用 JavaScript 来处理您的路由(backbone 之类的工具在此类情况下非常有用,并且带有很好的路由类),或者正常提交登录表单,而不是通过ajax。如果您在用户点击按钮时让表单提交并且不使用 JS 捕获它,这应该可以解决问题 - 如果您从服务器返回重定向,则页面将按预期重定向。或者,如果不发送重定向响应,您可以发送回指示成功或失败的 JSON,然后使用 JavaScript 显示适当的视图,这也可以解决问题。

    查看您的服务器端代码,我认为您在这里使用 ajax 的原因是为了设置授权标头。我不确定您为什么需要这些,因为您隐藏了内部身份验证功能,但是您可能会看到 not 使用 ajax 的问题是默认情况下您不会在正常情况下拥有这些自定义设置标题表单提交。当然有方法可以收集相同的信息并以相同的方式移动它(您可以设置标头,委托给其他方法,甚至从 express 发送 http 请求),但我需要更多关于您如何具体处理的详细信息登录以建议如何简化该部分:)

    【讨论】:

    • 如果我通过将按钮设置为“提交”按钮来正常提交登录,那么它实际上会对地址执行 GET:GET /login?username=whatever&password=something 这显然不是我想要的.我真正想要的只是使用 POST(我应该使用 PUT 吗?)提交用户凭据,在会话中设置用户名,然后在客户端的后续调用中使用在会话中找到的用户名以找出谁在获取/放置/发布/等。我正在使用 ajax,因为它很简单。我收集数据,我想发布一个 POST。
    • 我更改了标题,因为我在 SO 中的某个地方发现必须发生这种情况才能使事情正常进行。老实说,我想做这么简单的事情。
    • 投了赞成票,因为它有帮助。
    • 啊,您只需将form method 更改为POST,例如<form method='POST' action='/login'>。至于像这样改变标题,你不需要它,如果你只是把它放进去。
    • 如果你愿意,可以使用PUT,只需将其指定为表单方法即可:)
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2012-04-24
    • 2020-07-07
    • 1970-01-01
    • 2015-08-13
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多