2016-05-30 32 views
1

我在这里有一个很奇怪的问题,我认为这与Backbone.js路由有关。如何防止Backbone.js路由(或历史)自动将参数添加到GET请求?

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

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

所以即

http://localhost:3000/#login 

请求由于未知原因,成为

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

请注意,是在GET请求新的参数不是POST体的100%的部分,因为savePassword参数丢失。另请注意,登录请求违背API(/ api/user/login),而不是登录屏幕的路由(/#登录)

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

另一个通知:我只在移动设备上看到这个,所以在iOS上的UIWebView和Android上的WebView对象上。也许这个问题也涉及到移动...

我很高兴任何帮助,答案或提示,如何禁用此行为,并从这个怪异的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); 
      } 
     } 
    }); 
} 
+0

你可以展示AJAX的请求后(使用jQuery)? –

+0

用ajax代码编辑问题。 – nodepond

+0

作为另一个选项,你可以使用jQuery.post()https://api.jquery.com/jquery.post/ –

回答

0

根据jQuery.ajax()文档:

数据

类型:PlainObject或字符串或阵列

要发送到服务器的数据。如果 不是字符串,它将被转换为查询字符串。它附加到GET请求的url。请参阅 processData选项以防止此自动处理。对象必须是 是键/值对。如果value是一个数组,则jQuery将基于传统设置 (如下所述)的值使用相同密钥对多个 值进行序列化。

而且比,你应该在你的设置中添加processData等于假:

过程数据(默认值:true)

类型:Boolean

默认情况下,数据传递在数据选项中作为对象 (技术上,除了字符串以外的任何东西)将被处理并且 被转换成一个查询字符串,适合默认内容类型 “application/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); 
      } 
     } 
    }); 
} 
+0

感谢您指出这一点。让我更了解jQuery。但不幸的是,这并没有解决我的问题。但是我似乎越来越接近,登录后的每个请求都被解释为表单提交请求(我猜是通过内部路由)。然后,这个来自输入字段的名称魔术将参数放入URL中。 http://www.w3schools.com/tags/att_form_method.asp – nodepond

+0

这个具体的例子是'method =“get”'的形式。您应该使用'method =“post”'代替 –

+0

我们使用ajax-在JavaScript中提交表单时使用基于POST的POST。但我的猜测是,由路由触发的后续请求被解释为表单提交请求,这似乎是GET起作用的地方。 – nodepond