直接 加个 P3P协议就OK了

 

 1.打开IIS管理器 inetmgr 2.选择被嵌入iframe源站点或者目录,右键点击打开属性框 3.切换到HTTP头 4.添加 5.自定义HTTP头名: P3P 6.自定义HTTP头值: CP="CAO PSA OUR" 7.关闭属性框退出,即刻生效

 

 

 response.setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

 

 

 http://baike.baidu.com/view/722330.htm?fr=ala0_1

posted @ 2009-12-24 16:28 光年 阅读(191) 评论(0) 编辑

KB-Cross-domain access denied issue of ASP.NET AJAX page

高高興興地將網頁改版成ASP.NET AJAX,在測試台上驗證無誤,今天程式才剛上線,我臉上也出現三條線。

新網頁放在首頁下的一個Frame裡,要命的是首頁與新網頁位於不同的Server,於是只要在新網頁的任何地方按下滑鼠左鍵,都會彈出"Access is denied"的Javascript Error。追了一下,發現問題出在MicrosoftAjax.js上,裡面有一段Code... (問題出在5959列)

switch(Sys.Browser.agent) {
case Sys.Browser.InternetExplorer:
Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element)
...省略...
var offsetL = w.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2;
...省略...

看到沒有,不分青紅皂白就去讀top物件,當網頁被嵌在不同Domain的Frame或IFrame時,不出問題才有鬼! 這也難怪之前在測試台時,網頁與入口網站在同一台主機,沒有跨Domain的問題,能無憂無慮地通過測試。

幸好,我不是這個臭Bug唯一的受害者,網路上已經有先賢先烈找到解決方法。 主要的關鍵是將有問題的MicrosoftAjax.js換掉,改成我們自己修改的版本。AJAX的js檔都已經是用Embedded Resource的方式藏在DLL中,而用ScriptResource.axd將它取回。所幸,ScriptManager提供了方法可以改用靜態檔 案,方法是先去下載Microsoft AJAX Library ,將解壓縮在你的Web Application目錄後,接著修改ScriptManager的宣告:

<asp:ScriptManager ID="ScriptManager1" runat="server"><Scripts>
<
asp:ScriptReference
    Name="MicrosoftAjax.js" ScriptMode="Auto"
   
Path="~/[WebAppPath]/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js"/>
</Scripts></asp:ScriptManager>

如此,ScriptManager會以WebAppPath/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.debug.js取代Embedded在DLL中的版本。下一步是修改程式,將case Sys.Browser.InternetExplorer:到case Sys.Browser.Safari:間的程式碼換成以下的寫法:

Sys.UI.DomElement.getLocation = function(element) {
if (element.self || element.nodeType === 9) return new Sys.UI.Point(0,0);
var clientRect = element.getBoundingClientRect();
if (!clientRect) {
return new Sys.UI.Point(0,0);
}
var ownerDocument = element.document.documentElement;
var offsetX = clientRect.left - 2 + ownerDocument.scrollLeft,
offsetY = clientRect.top - 2 + ownerDocument.scrollTop;

try {
var f = element.ownerDocument.parentWindow.frameElement || null;
if (f) {
var offset = 2 - (f.frameBorder || 1) * 2;
offsetX += offset;
offsetY += offset;
}
}
catch(ex) {
}

return new Sys.UI.Point(offsetX, offsetY);
}
break;

修改完成,果然就沒有錯誤訊息了! Case Closed.

謝謝前人的血汗與分享,並期待ASP.NET AJAX快點出Service Pack。

Published 13 April 2007 02:04 AM 由 Jeffrey Filed under: , ,
posted @ 2009-07-28 11:49 光年 阅读(118) 评论(0) 编辑

以前看了几篇这方面的文章,但是都未能找到一个合适的解决方法。
获取同一个域的数据,可以通过XMLHTTP组件或IFRAME来实现,不存在跨域访问的权限问题,因此比较简单。
但如果要访问不同域的数据时,由于浏览器的安全设置,XMLHTTP没有权限获取数据,而IFRAME没有权限将获取的数据传递给父窗口,似乎没有其它解决办法。
在网上提到的方法,不外乎这两种:
1. 如果要获取的数据位于同一个根域但是不同子域时,可以在脚本中指定document.domain为父域。
2. 如果要获取的数据位于不同的根域时,则可以在服务器上写一个脚本作为代理,由服务器上的脚本获取不同域的数据,然后传递给在同一个域中的网页。
以上两种方法很容易便能想到,现在的问题是,如果要获取一个不同根域的数据时,该如何实现?

一般我们不会漫无目的地去网上获取数据,往往是从指定的服务器上获取数据,就像Google MapsGoogle Adsensereferer这样的网页插件,一般都是以脚本的形式提供给用户使用的。这时,如果要求用户在自己的服务器上写个代理的话,易用性就要大打折扣。获取你会考虑为用户写好各种脚本的代理,PHP、ASP、Python、Perl……,但是,如果这台服务器不支持动态脚本,又该怎么办呢?
想了两天都没想通这个问题(除去上班时间其实不到两个小时),曾考虑过用浏览器的漏洞来实现,但是这样做不能长久,因此放弃。随后发现Google本地搜索的地图数据来自于mapabc.com,好家伙,他们是怎么办到的?
用FireFox的DOM查看器可以看到,地图区是一个IFRAME,难道是用IFRAME实现的?但是拖动地图时如何知道要下载哪些图片的?这些数据是一定要从服务器上获取的,难道放这些数据的服务器也是google.com域内的?应该不会这么麻烦。
随即找来Google Maps的API进行开刀,官网给的范例网页如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=abcdefg"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[

function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
}
}

//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 500px; height: 300px"></div>
</body>
</html>

把http://maps.google.com/maps?file=api&v=2&key=abcdefg下载下来看了一下,里面有一句:

GScript("http://maps.google.com/mapfiles/maps2.67.api.js");
这句就是用来加载地图操作库的,GScript函数定义为:
function GScript(src) {document.write('');}
顿悟……
网页内引用不同域的脚本并不会提示权限不足,对了,就是它没错!
这个方法其实我早应该想到的,可能是太久没玩javascript的缘故吧。不论是referer还是Google Analytics,要统计页面访问信息,都要用脚本来向服务器提交信息,只是它们只提交一次(Google Analytics有统计逗留时间,应该有好几次)。习惯性地,我把提交和下载数据分开了,所以不容易想到这个方法。
但是用document.write始终不是好办法,它会清除页面上原有的内容。改进的方法估计你已经想到了,可以参考一下我很早以前乱写的这篇文章《有效地组织页面中复杂的JavaScript脚本》里的思想。
继续分析Google Maps的代码,打开http://maps.google.com/mapfiles/maps2.67.api.js,里面有这样的代码:
ta.prototype.Hk=function(a,b){var c=this.ql(a);if(c){window.setTimeout(function(){b(c)},
0)}else{var d="__cg"+Zf++ +(new Date).getTime();try{if(this.qe==null){this.qe=document.getElementsByTagName("head")[0]}var e=window.setTimeout(sd(d,b,a,403),15000);if(!window.__geoStore){window.__geoStore={}}window.__geoStore[d]=Jf(this,d,b,e);var f=document.createElement("script");f.type="text/javascript";f.id=d;f.charset="UTF-8";f.src=this.vl+"?q="+window.encodeURIComponent(a)+"&output=json&callback=__geoStore."+d+"&key="+this.Lh;this.qe.appendChild(f)}catch(g){if(e){window.clearTimeout(e)}window.setTimeout(sd(d,
b,a,500),0)}}};
script节点也是动态创建的,这样就可以避免document.write产生的问题。

解决方法找到了,现在来简单测试一下:
1. 在本地服务器上新建一页面。
test.html:

<html>
<head>
<title> Over-Domain Data Fetching Test Page</title>
<script type="text/javascript">
var lastScript;
var h=document.getElementsByTagName("head")[0];</code>

function loadScript(url){
var f=document.createElement("script");
var d=new Date().getTime();
f.type="text/javascript";
f.id=d;
f.src=url+'?'+d;
h.appendChild(f);
if(lastScript&&g(lastScript))g(lastScript).parentNode.removeChild(g(lastScript));
lastScript=d;
}

function g(x){return document.getElementById(x)};
</script>
</head>

<body>
<button onclick="loadScript('http://localhost/alert.js')">Test Alert</button><br />
<button onclick="loadScript('http://localhost/info.js')">Get My Info</button><br />
My Name: <input id="myname" type="text" value="" /><br />
My Blog: <input id="myblog" type="text" value="" />
</body>
</html>
解释两个关键点:
1. lastScript用于存放上次建立的script节点的ID,在下次要再新建script节点时,要删除上次建立的节点,以免加载的脚本越来越多,占用过多的内存。
2. url后面加了一个数值d是为了防止浏览器缓存脚本数据,在本例中可以不加,但是如果脚本是由服务器动态生成的,那最好加上。
然后再建立两个javascript脚本用于测试:
alert.js:
alert('You can see me!');
info.js:
g('myname').value='Hily Jiang';
g('myblog').value='http://hily.iyi.cn/';
好了,把它们放在本地服务器的根目录下,敲入http://127.0.0.1/test.html,这样它和localhost就不在同一个域内了。
点击“Test Alert”,应该会弹出对话框显示You can see me!。
点击“Get My Info”,应该会在文本框中显示我的信息。
(以上测试页在IE 6.0和FireFox1 .5.0下测试通过。)

嗯,不早了,睡觉去~

posted @ 2009-07-14 11:14 光年 阅读(425) 评论(0) 编辑

解决 UPDATEPANEL 内 ScriptManager1.SetFocus 设置焦点 输入法 变更的问题

 

1ScriptManager.RegisterStartupScript(this.Page, this.GetType(),"AddDropdownList""sl('" + this.otherid.Value +"');changecss();$(\"#input9\").focus();"true);
2
不使用scriptManager 的setfocus解决焦点问题
posted @ 2009-07-03 17:08 光年 阅读(303) 评论(0) 编辑

refactoring 昨天从经理那 借到这本书的时候 还是 比较高兴的,因为以前自己经常 会 随意的做一些 小的 代码调整,改变代码的结构,删除 没有的 代码

。。。。。高兴啊,就在博客上记一些 有用的重点吧,以便以后的随手 查阅

 

虽然这本书是java的 ,随让 咱以前也学过 java呢,嘿嘿``

我深深的体会到 ,前期的设计,和使用 设计模式,到后期的代码重构 真是两个 复杂的课题

 

----------------------

书里原句:

古老的工程学格言:如果它没坏,就别动它,这个程序也许还没坏掉,但它带来了伤害。它让你的生活比较难过,因为你发现很难完成客户所需要的修改,这时候就该重构技术粉墨登场了!

如果你发现 自己需要为程序添加一个特性,而代码结构使你无法很方便地那么 做,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性

 

posted @ 2008-10-22 08:10 光年 阅读(29) 评论(0) 编辑
posted @ 2008-08-06 16:29 光年 阅读(339) 评论(0) 编辑
posted @ 2008-07-03 12:29 光年 阅读(32) 评论(0) 编辑
posted @ 2008-07-01 18:16 光年 阅读(728) 评论(1) 编辑