如何防止 Backbone.js 路由(或历史记录)自动将参数添加到 GET 请求?

Posted

技术标签:

【中文标题】如何防止 Backbone.js 路由(或历史记录)自动将参数添加到 GET 请求?【英文标题】:How to prevent Backbone.js routing (or history) to automagically add parameters to GET-request? 【发布时间】:2016-05-30 16:17:39 【问题描述】:

我有一个非常奇怪的问题,我认为这与 Backbone.js 路由有关。

在我们的移动应用程序中,有一个登录屏幕,它执行针对 API 运行的 AJAX-Post-Request(使用 jQuery)。用户名、密码和第三个参数在 POST 正文中。这就像一个魅力。

在 Backbone.js 开始做一些路由之后,奇怪的行为开始了。重定向浏览器后,(仅!)用户名和密码作为参数列表发送到 GET 请求。

所以请求即

http://localhost:3000/#login

不知什么原因变成了

http://localhost:3000/?username=myuser&password=mypassword#login

请注意,GET 请求中的新参数不是 POST 正文的 100% 部分,因为缺少 savePassword 参数。另请注意,登录请求与 API (/api/user/login) 相违背,而不是登录屏幕的路由 (/#login)

我已经尝试了很多东西,也将所有主干源代码分开,但仍然找不到如何防止这种行为。

另一个通知:我只在移动设备上看到这个,所以在 ios 上的 UIWebView 和 android 上的 WebView-object 中。可能这个问题也和手机有关……

我很高兴获得任何帮助、答案或提示,以及如何禁用此行为并从这个怪异的 URL 中获取用户名/密码。

已编辑: 这是用于登录的 AJAX 请求。

login: function(username, password, savePassword, successcallback, errorcallback) 
    $.ajax(
        method: 'POST',
        dataType: 'json',
        url: config.api_base_url + 'user/login',
        data: 
            username: username,
            password: password,
            savePassword: savePassword
        ,
        success: function(data, response, xhr) 
            app.auth_token = xhr.getResponseHeader('Authtoken');
            $.cookie('auth_token', app.auth_token);
            if (successcallback) 
                successcallback();
            
        ,
        error: function(data) 
            if (errorcallback) 
                errorcallback(data);
            
        
    );

【问题讨论】:

你能显示 AJAX-Post-Request(使用 jQuery)吗? 用 ajax 代码编辑了问题。 作为另一个选项,您可以使用 jQuery.post() api.jquery.com/jquery.post 【参考方案1】:

根据jQuery.ajax() docs:

数据

类型:PlainObject 或 String 或 Array

要发送到服务器的数据。它被转换为查询字符串,如果 还不是一个字符串。它附加到 GET 请求的 url。看 processData 选项来防止这种自动处理。对象必须 是键/值对。如果 value 是一个 Array,jQuery 会序列化多个 基于传统设置的值具有相同键的值 (如下所述)。

然后,您应该在设置中添加 processData 等于 false:

processData(默认:true)

类型:布尔值

默认情况下,数据作为对象传入 data 选项 (从技术上讲,除字符串之外的任何内容)将被处理并 转换为查询字符串,适合默认的内容类型 “应用程序/x-www-form-urlencoded”。如果你想发送一个 DOMDocument 或其他未处理的数据,将此选项设置为 false。

代码 jQuery.ajax():

login: function(username, password, savePassword, successcallback, errorcallback) 
    $.ajax(
        method: 'POST',
        dataType: 'json',
        url: config.api_base_url + 'user/login',
        data: 
            username: username,
            password: password,
            savePassword: savePassword
        ,
        processData: false,
        success: function(data, response, xhr) 
            app.auth_token = xhr.getResponseHeader('Authtoken');
            $.cookie('auth_token', app.auth_token);
            if (successcallback) 
                successcallback();
            
        ,
        error: function(data) 
            if (errorcallback) 
                errorcallback(data);
            
        
    );

【讨论】:

感谢您指出这一点。让我更好地理解了 jQuery。但不幸的是,这并没有解决我的问题。但我似乎越来越接近登录后的每个请求都被解释为表单提交请求(我猜是通过一些内部路由)。然后输入字段中的这个名称魔法将参数放入 URL。 w3schools.com/tags/att_form_method.asp 那个具体的例子是一个带有method="get"的表单。你应该改用method="post" 我们在使用 javascript 提交表单时使用基于 ajax 的 POST。但我的猜测是,由路由触发的后续请求被解释为表单提交请求,这似乎是 GET 发挥作用的地方。

以上是关于如何防止 Backbone.js 路由(或历史记录)自动将参数添加到 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用backbone.js 路由器切换视图?

Backbone JS - 路由器问题 - 如何获得干净的 URL

Backbone.js:查看状态和路由

Backbone.js:未达到路由器回调

Backbone.js URL 路由

触发同位置路由