我正在研究一个项目并遇到了一个问题,到目前为止我一直无法解决。
该项目是使用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:" + ' ' + '<br>' + "token:" + ' ' + 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 :(得分: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);