2011-08-23 68 views
1

我正在开发一个项目,并且遇到了迄今为​​止我一直无法解决的问题。正在检索HTTP标头令牌

该项目是一个使用jquery移动框架构建的移动web应用程序。 Web应用程序可以从wcf服务中提取json并使用jquery mobile ui效果进行渲染。我们已经达到了我们正在实施基于令牌的安全性的阶段,这是我的问题所在。在这一刻,我想添加一个自定义的HTTP Header,我将用它来处理所有其他的Ajax请求。

function login_service() 
{ 
    //$.mobile.pageLoading(); 
    var stringUsername = $('#txtUsername').val(); 
    var stringPassword = $('#txtPassword').val(); 
    $('#loginMessage').empty(); // Empty message div   
$.ajax(
    { 
     url: "urlstring"+stringUsername+"/"+stringPassword, // This URL uses https 
     dataType: "jsonp", 
     type: 'GET', 
     beforeSend: setHeader, 
     success: function(loginResult) 
     { 
      $('#loginMessage').html('<a>'+ loginResult.tkt + '</a>'); 
      tkn = loginResult.tkt; // Json token 
      if(tkn == null) 
      { 
      $('#loginMessage').append("invalid login:" + '&nbsp;' + '<br>' + "token:" + '&nbsp;' + tkn); 
      $.mobile.pageLoading(true); 
      } 
      else 
      { 
       $.mobile.changePage('#search'); // Change page to search screen 
      } 

     }, 
     error: function(status) 
     { 
      alert(status); 
      $.mobile.pageLoading(true); // End loading animation 
     } 
    }) 
} 

function setHeader(xhr) 
{     
    xhr.setRequestHeader('Authorization', tkn); 
    alert("header set");    
} 

function doSearch_webservice(){ // Start of function webservice 
$.ajax({ // Start of ajax call 
url: "urlstring"+$('#jsonSearch').val(), // If URL string is http, custom header will 
     // be displayed in fiddler/firebug. IF HTTPS custom header won't work. 
dataType: 'jsonp', 
type: 'GET', 
timeout: '20000', 
beforeSend: setHeader, 
success: function(json_results) 
    {// Start of success function 
     if(json_results.keys == null) 
      { 
       $('#errMessage').html('<p class="error"><strong>'+ "Status:" 
       + "No record found" + "<br>Please try again" +'</strong> </p>');  
       $.mobile.pageLoading(true); 
      } 
     else 
      { 

       $('#jsonResponse ul').remove(); 
       // jquery mobile type i.e. data-inset 
       $('#jsonResponse').append('<ul class="listItems" data-role="listview" data-inset="true"></ul>'); 
       var listItems = $('#jsonResponse').find('ul'); 
       $.each(json_results.keys, function(key) { // Start of each loop 

       html= 
       '<a href="#" data-transition="slide" data-position="inline"OnClick="passQryStrg(\''+json_results.keys[key].id+'\' , \''+json_results.keys[key].cat+'\');">'+'<br>'+' '+'<font class="big-text"><b>'+' '+json_results.keys[key].lbl[0]+' '+'</font></b>'+' '+'<font class="small-text">'+' '+'<br>'+' '+json_results.keys[key].lbl[1]+' '+'</font>'+'</a>' 

       listItems.append('<li>'+html+'</li>'); 
       }); // End of each loop 
      $('#info jsonResponse ul').listview(); 
      $.mobile.pageLoading(true); 
      $.mobile.changePage("#info", { transition: "slide"}); 
      $("#info").page("destroy").page(); 
      } 
       // Destroy the page - next function call won't break css 
     }, // End of success function 
     error: function(jqXHR, textStatus, errorThrown) 
      { 
       $('#errMessage').html('<p class="error"><strong>'+ "Status:" + textStatus + "<br>Please try again" +'</strong> </p>'); 
       $.mobile.pageLoading(true); 
       } 
      }); // End of ajax call 
}; // Emd of webservice function 

摘要: 如果do_search Ajax请求使用HTTP URL,我可以添加自定义标题。不过,我需要将URL更改为我们的wcf服务使用的https。当我做这个改变自定义标题停止工作。如果我的解释不清楚,我会尽力答复最好的答复。

感谢

+0

如果我在我的jquery ajax请求中使用https url,任何人都知道什么是阻止我的自定义http标题工作? –

回答

3

I解决了我一直存在的问题。

使用xmlHttpRequest对象创建自定义HTTP请求标头时。或者在我的情况下,因为我一直在使用jQuery,一个Ajax请求。发出请求的网页和请求本身都必须使用具有相同协议的网址。例如。 HTTPS。如果网页有一个http url,并且它使用https发出一个ajax请求,这将不起作用。

这是因为http://www.w3.org/Security/wiki/Same_Origin_Policy上定义的同源策略不允许。它是为了保护网站免受安全漏洞的侵害。没有这种安全性,脚本可以利用网站漏洞。

希望这可以帮助任何被困在这个特殊问题上的人。

0

您应该使用的jQuery.ajax()headers选项。

$('...').ajax(function() { 
    url: ... , 
    data: ... , 
    headers: { 
    'Authorization': tkn 
    } 
}); 

如果JSON令牌:

的附加头键/值对的地图伴随该请求

所以你需要通过你的头这种方式发送是一个字符串,只需在之前将其转换为jQuery.parseJSON()

var tkn = $.parseJSON(tokenString); 
+0

嘿谢谢你的回复。我感觉有点傻,因为它不工作的原因是因为我正在调试localhost中的web应用程序。一旦我将它上传到服务器,它就能够添加我的自定义标题。不过,我现在有另一个问题。检查我的原始消息。 –

+0

另外我使用XHR对象与示例代码略有不同,但我相信这两种方法都是有效的。 –