检索HTTP标头令牌

时间:2011-08-23 14:02:25

标签: jquery ajax wcf https

我正在研究一个项目并遇到了一个问题,到目前为止我一直无法解决。

该项目是使用jquery移动框架构建的移动Web应用程序。 Web应用程序可以从wcf服务中提取json并使用jquery mobile ui效果进行渲染。我们已经到了实现基于令牌的安全性的阶段,这就是我的问题所在。此时,我想添加一个自定义HTTP标头,我将用于所有其他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。当我进行此更改时,自定义标头停止工作。如果我的解释不清楚,我会尽力回答我的答案。

由于

2 个答案:

答案 0 :(得分:3)

我已经解决了我一直遇到的问题。

使用xmlHttpRequest对象创建自定义HTTP请求标头时。或者在我的情况下,因为我一直在使用jquery,一个ajax请求。发出请求的网页和请求本身都必须使用具有相同协议的URL。例如。 HTTPS。如果网页上有一个http网址并且使用https发出ajax请求,则无法使用。

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

希望这可以帮助任何陷入这个特殊问题的人。

答案 1 :(得分:0)

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

  

要与请求一起发送的其他标题键/值对的映射

所以你需要以这种方式传递你的标题:

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

如果你的JSON令牌是一个字符串,只需在jQuery.parseJSON()之前转换它:

var tkn = $.parseJSON(tokenString);