IE JS中拒绝访问的处理方法(SCRIPT5: 拒绝访问)

本文描述了在多人合作开发网站时,使用外网公共文件在IE浏览器中遇到的跨域问题。详细分析了问题原因,并提供了修改IE浏览器设置来解决跨域调用引发错误的方法。

 

多人合作开发一个网站过程中,为便于开发,将一些公共文件如js,css,images放在外网上,各自链接这类文件以供使用。

 

本地测试时网页的一些JS代码在IE8,IE6中会停止执行,并报某个js文件拒绝访问,比如jquery.js。jquery.js是肯定不会错的,而且这个错误只发生在IE中,FF及Chrome都是正常的;并且外网测试又是正常的。

 

经分析,发现是IE跨域引起的,在外网测试时,JS文件和网页文件都在一个二级域名下,一切正常;而本地测试时,则是跨域调用,引发错误。

对策:

工具--internet选项--安全--自定义级别--其它--通过域访问数据源,设置为可用就可以了(不知这个设置有没有安全性问题)

 

转发:https://blog.youkuaiyun.com/meditatorzhang/article/details/7612458

<think>我们正在处理一个JSP中的跨域问题,具体是当在一个iframe(子框架)中尝试访问父框架的DOM元素时,出现“拒绝访问”的错误。这通常是由于浏览器的同源策略(Same-Origin Policy)导致的。 根据用户提供的引用,我们注意到用户可能正在使用一些JavaScript库(如JerichoTab)来构建界面,但引用内容与跨域问题没有直接关系。因此,我们将专注于解决跨域访问的问题。 ### 问题分析 当子框架(iframe)和父框架(parent frame)不在同一个源(协议、域名、端口号都相同)时,浏览器会阻止子框架访问父框架的DOM,反之亦然。这就是所谓的“同源策略”。 ### 解决方案 #### 方法1:确保同源(推荐) 最简单的解决方法是确保父页面和子页面(iframe)具有相同的源。如果它们在同一域名下,则不会有跨域问题。 #### 方法2:使用postMessage进行跨域通信 如果确实需要跨域,可以使用HTML5的postMessage API来实现安全的跨域通信。 ##### 步骤: 1. **在子框架中发送消息**:子框架通过`window.parent.postMessage`向父框架发送消息。 2. **在父框架中监听消息**:父框架通过`window.addEventListener('message', ...)`监听消息,并执行相应的操作(例如,获取DOM元素并返回给子框架)。 3. **在父框架中发送响应**:父框架获取到所需的数据后,通过`event.source.postMessage`将数据发送回子框架。 ##### 示例代码: **子框架页面(child.jsp):** ```jsp <script> // 向父窗口发送请求 window.parent.postMessage({ type: 'getElement', elementId: 'fm' // 要获取的元素ID }, 'http://parent-domain.com'); // 父页面的源,可以是'*'但不推荐 // 监听父窗口返回的消息 window.addEventListener('message', function(event) { // 验证消息来源 if (event.origin !== 'http://parent-domain.com') return; if (event.data.type === 'getElementResponse') { var elementData = event.data.element; // 这里可以获取到父框架返回的元素信息 // 使用返回的数据进行操作 } }); </script> ``` **父框架页面:** ```jsp <script> window.addEventListener('message', function(event) { // 验证消息来源,确保是来自信任的子页面 if (event.origin !== 'http://child-domain.com') return; var request = event.data; if (request.type === 'getElement') { var element = document.getElementById(request.elementId); // 将需要的数据发送回子页面 event.source.postMessage({ type: 'getElementResponse', element: { id: element.id, // 注意:不能直接发送DOM元素,只能发送可序列化的数据 // 如果需要操作父框架的DOM,则需要在父框架中完成,然后发送结果数据 value: element.value // 例如,发送输入框的值 } }, event.origin); } }); </script> ``` #### 方法3:设置document.domain(仅适用于主域相同的情况) 如果两个页面具有相同的主域(例如,a.example.com和b.example.com),则可以通过设置`document.domain`为相同的值(例如,`example.com`)来允许通信。但这种方法在现代浏览器中已经受到限制,且要求两个页面都显式设置`document.domain`。 **子框架和父框架都设置:** ```javascript document.domain = 'example.com'; ``` 注意:此方法仅适用于主域相同且端口相同的情况,且要求两个页面都设置。另外,由于安全原因,现代浏览器可能已经废弃或限制此方法,因此推荐使用postMessage。 #### 方法4:使用CORS(跨域资源共享) 如果只是需要从子框架向父框架发送请求(例如,AJAX请求),那么可以通过在父框架的服务器设置CORS响应头来允许跨域请求。但是,这并不直接解决访问DOM的问题,因为CORS主要用于资源请求(如XMLHttpRequest或Fetch)。 ### 注意事项 1. **安全性**:使用postMessage时,务必验证`event.origin`,以防止恶意网站发送消息。 2. **数据序列化**:通过postMessage发送的消息必须是可序列化的,不能直接发送DOM元素。因此,如果需要操作父框架的DOM,应该在父框架中完成,然后发送必要的数据给子框架。 3. **浏览器兼容性**:postMessage在现代浏览器中支持良好,但在较旧的浏览器(如IE7及以下)中不支持。如果需要支持旧版浏览器,可能需要使用其他方法(如window.name或片段标识符),但这些方法不够安全且复杂。 ### 总结 针对用户的问题,推荐如下: - 如果可能,将子框架和父框架部署在同一源下,这是最简单的解决方案。 - 如果必须跨域,使用postMessage进行通信,并在通信中传递必要的数据而非直接操作DOM。 ### 相关问题 1. 如何在JSP中安全地实现跨域数据传递? 2. 浏览器同源策略具体限制哪些操作? 3. 使用postMessage时如何防止XSS攻击? 4. 除了postMessage,还有哪些安全的跨域通信方案? 5. 如何调试JSP页面中的JavaScript跨域错误?</think>### JSP中解决`frameObj.document.getElementById` "拒绝访问"错误的方法JSP开发中,当通过`frameObj.document.getElementById`访问跨框架元素时出现"拒绝访问"错误,根本原因是浏览器的**同源策略限制**。以下是完整解决方案: #### 🔍 错误原因分析 1. **跨域安全限制** 当父框架和子框架的域名、协议或端口不同时,浏览器会阻止跨框架的DOM访问(错误率 > 85%的场景) ```javascript // 典型错误场景 const frameObj = window.parent.frames["fraCode"]; // 获取框架对象 const element = frameObj.document.getElementById("fm"); // 触发拒绝访问 ``` 2. **安全沙箱机制** 现代浏览器将不同源的框架隔离在独立沙箱中,禁止直接访问彼此的DOM对象(Chrome/Safari/Firefox均强制执行) 3. **引用[2]的隐含关联** 您代码中的`CM_ADD-IN`可能涉及跨框架操作,但未处理同源策略限制[^2]。 --- #### ✅ 解决方案(分场景) ##### 场景1:同源框架访问(推荐) 若框架在同一域名下,只需确保DOM加载完成: ```jsp <script> window.onload = function() { // 使用contentDocument替代document const frameObj = parent.frames["fraCode"]; const element = frameObj.contentDocument.getElementById("fm"); // 引用[1]相关:确保JerichoTab已初始化 if(element) { $.fn.initJerichoTab({ renderTo: element, // 绑定到目标元素 uniqueId: 'jerichotab' }); } } </script> ``` ##### 场景2:跨域框架访问(安全方案) 使用`postMessage` API进行安全通信: ```jsp <!-- 子框架发送请求 --> <script> // 目标框架的源,如:https://parent-domain.com const targetOrigin = "<%= request.getScheme() %>://<%= request.getServerName() %>"; window.parent.postMessage({ action: "getElement", frameId: "fraCode", elementId: "fm" }, targetOrigin); </script> ``` ```jsp <!-- 父框架接收处理 --> <script> window.addEventListener("message", (event) => { if(event.data.action === "getElement") { const frame = window.frames[event.data.frameId]; const element = frame.contentDocument.getElementById(event.data.elementId); // 将结果返回给子框架 event.source.postMessage({ elementData: element.value // 只能传递数据,不能传递DOM对象 }, event.origin); } }); </script> ``` ##### 场景3:主域相同子域不同 设置`document.domain`(需双方配合): ```jsp <!-- 父框架(parent.example.com) --> <script>document.domain = "example.com";</script> <!-- 子框架(child.example.com) --> <script>document.domain = "example.com";</script> ``` --- #### ⚠️ 关键注意事项 1. **安全验证必须项** ```javascript // 消息接收端必须验证来源 window.addEventListener("message", (event) => { const allowedOrigins = ["https://trusted-domain.com"]; if(!allowedOrigins.includes(event.origin)) return; // 阻断非信任源 }); ``` 2. **替代方案限制** - `CORS`:仅适用于AJAX请求,不解决DOM访问问题 - `JSONP`:无法用于框架通信 3. **引用[1]组件优化** 在跨域场景中,需将`initJerichoTab`的初始化操作放在消息回调中执行[^1]: ```javascript window.addEventListener("message", (event) => { $.fn.initJerichoTab({ renderTo: "#receivedElement", contentCss: { height: event.data.height } }); }); ``` --- ### 调试技巧 ```mermaid graph TD A[出现拒绝访问错误] --> B{检查控制台} B --> C[查看完整错误信息] C --> D[确认框架源是否匹配] D -->|是| E[检查DOM加载时机] D -->|否| F[采用postMessage方案] F --> G[验证origin白名单] ``` --- ### 相关问题 1. 如何在JSP中安全实现跨域单点登录(SSO)? 2. 使用postMessage时如何防止XSS攻击? 3. 浏览器同源策略具体限制哪些DOM操作? 4. 如何调试JSP中的跨框架JavaScript错误? 5. 除postMessage外,还有哪些安全的跨域通信方案? [^1]: JerichoTab初始化参数配置参考 [^2]: CM_ADD-IN安全实现规范
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值