最近在作項目中發現,我用下面的代碼異步請求到login.ashx:html
var memberUrl = rooturl + 'member.ashx?r=' + Math.random() + '&jsoncallback=?'; //添加jsoncallback參數是爲了解決跨域的問題 //驗證是否已經登陸 $.getJSON(memberUrl, { type: "checklogin" }, function (data) { if (data.status == 1) { //已經登陸成功,顯示用戶信息 $('#userinfo').html('歡迎您' + data.content + ' ' + successHtml); } else { //登陸失敗 $('#userinfo').html(waitHtml); } });
第一次請求時登陸成功,但當我刷新頁面時,卻又要再次登陸,通過測試發現:在firefox瀏覽器下是正常的,但在IE下卻每次須要再次登陸,我打印出來sessionId,發現竟然刷新後的sessionID已經改變了,須要查找資料終於找到解決辦法:json
問題根源:
IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,Firefox目前還不支持P3P安全特性,firefox中天然也不存 在此問題了。Mircosoft對此的具體描述能夠參見 Privacy in Internet Explorer 6跨域
解決辦法是在login.ashx中輸出P3P的主機頭聲明: 給個鏈接 百度文庫瀏覽器
http://wenku.baidu.com/view/ea504514866fb84ae45c8d2c.html緩存
代碼以下:安全
public void ProcessRequest(HttpContext context) { string result = string.Empty; context.Response.ContentType = "application/Json"; //業務處理,賦值result...... //解決IE緩存問題 context.Response.AddHeader("Cache-Control", "no-cache"); context.Response.AddHeader("Pragma", "no-cache"); //解決IE下SessionID丟失的問題 context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); //解決跨域問題 string cb = context.Request["jsoncallback"]; context.Response.Write(cb + "(" + result + ")"); }