解决iframe,frame和框架丢失或获取不到session,cookies问题

 
解决iframe,frame和框架丢失或获取不到session,cookies问题

引用地址:

Response.clear()
Response.CacheControl = "no-cache"
Response.Expires=0
Response.AddHeader "P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Response.Charset = "utf-8"
1、IE浏览器iframe跨域丢失Session问题
在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的因此,网上可以找到很多相关的文章,如果网站可以采用设置Web.Config中的配置: mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
把cookieless="false"改成"true"就可以了但也同样有个小问题,就是如果页面中采用Javascript的window.location.href=''这样的方式来重定向的话,系统会认为这是另一个新的请求,产生一个新的SessionId,导致原Session同样的丢失所以对于重定向,还是使用Response.Redirect()为好

除了Ifrmae有丢Session问题外,frameset也有同样的问题Frameset的问题更不确定,是有时会丢,有时不会丢,这更认人头痛,在网上找到了一个方法,在页面page_onload里添加一语句:
Response.AddHeader("P3P","CP=CAO PSA OUR");
FrameSet中的Session丢失问题就解决了至于里面具体的原因 也没时间去搞懂了

最简单的方法就是在iis里设置

解决办法
response.addHeader("P3P","CP=CAO PSA OUR")。
不过难道我们需要在每个页面都加这个么?

不需要的

如果有权配置IIS服务器

打开IIS

管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头
然后输入头名:P3P
输入头内容:CP=CAO PSA OUR

如果没有权限配置IIS服务器,但是你用的是asp.net的话

可以用httpmodual来实现在全部页面或者部分页面头部插入所需要的标志

本站点的某个目录就是这样实现的


2、用P3P header解决iframe跨域访问cookie

本文来源:http://blog.youkuaiyun.com/wonder4/archive/2008/02/27/2125804.aspx


目前在整合几个应用时,遇到了iframe无法获取cookie(session)的问题,经过google,终于把这个问题解决了,现在记录一下。
   我的需求是这样的。
   有一个应用是用.net开发的,主要是控制用户登录,用户访问权限的,部署在上海机房。现在就叫A应用吧
   还有一个应用是用java开发,主要是具体业务的操作。部署在北京机房,这里叫B应用吧
   由于已经有一个用户管理和权限的应用程序,所以java 开发的这个B应用就没有开发用户权限的功能,想直接使用.net的A程序。

用户访问的流程是这样的:
    1.用户先在A处登录,A设自己的cookie,在A的菜单里有去B应用的链接
    2.当用户点去B应用的链接时,A在链接上自动加上这个用户的token,传给B系统
  3.当B系统接收到请求后,把这个用户的token信息设成自己系统的cookie,(B系统里有表单post操作,如果不设cookie,session,那么每个请求不管GET还是POST都要明确带着该用户的token信息,对于系统的改造量比较大,另外以后换权限验证方法改动也比较大。)
  4.用户在B系统里的每次操作都没有明码带用户的token,所以每次都要去cookie得到token信息,然后发送一个http请求去A,让A系统验证这个用户是否有权限访问。
    5.如果A系统的接口返回可以访问的状态报告,那么B继续执行;如果A系统指示没有权限访问,那么B系统提示访问受控警告信息。

  一切开发都完成,到整合上线时,发现这个流程走不通,百思不得其解,想了半天也不知道 怎么 回事,google了半天,才发现原来是ie在捣鬼,IE不允许跨域访问cookie(好象firefox没问题,ie自6.0以后改用w3c组织的P3P协议了),再看看我的应用,在第二步设的cookie,在第三步以后所有B应用的访问请求,ie都把B应用的cookie blocked掉了(因为用户的访问是从A应用发起,从A应用访问B应用的东东,算跨域访问,IE认为有安全问题)。。。。(IE状态栏有一个红眼睛的button,点开可以看到哪些cookie给blocked掉了)

     知道原因就好办了,再google知道可以用P3P header可以解决问题!
     下面是java的解决办法之一,也是我的解决办法,不过个方法不太好:
     直接往响应里加一个P3P的header
     response().addHeader("P3P", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");

其中CP=“XXX XXXX”这些是有具体含义的:
     CP就是compact policies的意思,
    另外header的值也可以是policyref="http://myhost/P3P/PolicyReferences.xml",就是指定一个策略文件。

具体请看这里.

下面是摘抄的一段Compact Policies的具体取值范围和设值含义。
Compact Policies
Compact policies are essentially summaries of P3P policies. They can be used by user agents to quickly get approximate information about P3P policies, therefore improving performance.

For an in-depth explanation of compact policies, we refer to the P3P1.0[4] specification. Here, we limit to stating the syntax:

compact-policy-field  = `CP="` compact-policy `"`

compact-policy        = compact-token *(" " compact-token)

compact-token         =  compact-access           |

                                 compact-disputes         |

                                   compact-remedies         |

                      compact-non-identifiable |

                       compact-purpose          |

                         compact-recipient        |

                       compact-retention        |

                       compact-categories       |

                        compact-test compact-access        = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON"

                        compact-disputes      = "DSP"

                        compact-remedies      = "COR" | "MON" | "LAW"

                        compact-non-identifiable = "NID"

                        compact-purpose       = "CUR"        | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] |

                         "PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] |

                         "CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq]                       

                           creq                  = "a" | "i" | "o"

                        compact-recipient     = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] |

                                                             "PUB" [creq] | "OTR" [creq]

                        compact-retention     = "NOR" | "STP" | "LEG" | "BUS" | "IND"

                        compact-category      = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" |

                                                            "NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" |

                                                             "HEA" | "PRE" | "LOC" | "GOV" | "OTC"

                        compact-test          = "TST"

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/wonder4/archive/2008/02/27/2125804.aspx

"TST"另外这里还有一个P3P的验证工具:http://www.w3.org/P3P/validator.html,可以验证一下自己设置的P3P是否正确。这里还有一个老外写的不错的blog,也可以参考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2
[hr]
Response.AddHeader "P3P”跨域cookies,session 问题解决
场景一:

A网站全站均为UTF-8编码,B网站全站为GB2312编码。

A网站提供一段JS代码供B网站调用,该代码会动态生成一个FORM表单,以收集提交上来的数据。

B网站此时开始提交数据,但提交上来的中文均为乱码 。

现象的产生是由于二个网站编码不一致而导致的,一般情况下使二个网站的编码一致即可。

如果无法统一编码该怎么办?

FORM有一个accept-charset属性

<form method="post" action="..." accept-charset="utf-8">

... 

</form>   测试成功,但在IE下不成功,需要一个HACK来解决:
在form的onsubmit事件触发时动态改变document的编码,即:
οnsubmit="document.charset='utf-8';"

场景二:

A网站提供一个页面供其它网站进行Iframe调用,该页面使用了SESSION,并进行了SESSION判断。

现象:

B网站IFRAME了A网站的页面,总显示SESSION过期,但直接在浏览器中打开该页面却又是正常的。

这是由于浏览器的安全性所致,SESSION依赖于COOKIE,A与B是二个完全不同的域,A网站没法去读取B网站下的COOKIE,所以 SESSION也就失效了。

解决办法:

A网站的页面在输出头上附加一个P3P属性,值为CP=CAO PSA OUR即可。
如:

Response.AddHeader("P3P", "CP=CAO PSA OUR"); 

if (Session[SESSIONKEY] == null) 

   //TODO:其它操作 

}

 

在IE中,页面通过FRAME,JS,IMG等引用其他域名页面的时候,P3P协议会阻止引用也的cookie。

举例说明:
在 B.COM中,

<iframe   width = 300   height = 300   src = "”http://www.a.com/test.php”"   mce_src = "”http://www.a.com/test.php”"   >    view plaincopy to clipboardprint?
<iframe width=300 height=300  
src="”http://www.a.com/test.php”" mce_src="”http://www.a.com/test.php”"  
>
<iframe width=300 height=300
src="”http://www.a.com/test.php”" mce_src="”http://www.a.com/test.php”"
>
此时,test.php中产生的cookie将会被阻止,而不会记录下来

这种情况下,我们引入P3P header ,情况就改变喽~

P3P header允许跨域访问隐私数据,从而可以跨域set-cookie成功

www.a.com/test.php中这样写:

header(’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘); 
header(’P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);

cookie就可以跨域了~

这种方法在单点登陆中被广泛应用~

<think>好的,我现在需要详细介绍一下iframe以及对应的爬虫策略。首先,我得回忆一下iframe是什么,在HTML中的作用是什么。iframe是Inline Frame的缩写,用来在当前网页中嵌入另一个网页。它通过<iframe>标签实现,src属性指向嵌入页面的URL。常见的应用场景包括嵌入地图、广告、视频其他第三方内容。 接下来,用户想知道爬虫在遇到iframe时需要注意什么,有什么策略。我需要先说明iframe对爬虫带来的挑战。因为主页面iframe中的内容是分开加载的,普通的爬虫可能只会获取主页面内容,而忽略iframe里的数据。所以,处理iframe的关键在于识别并单独抓取iframe内的内容。 然后,我需要分步骤介绍具体的爬虫策略。首先,如何检测页面中是否存在iframe。可以通过解析HTML,查找所有的<iframe>标签。然后,获取iframe的src属性,得到嵌入页面的URL。这一步需要注意相对路径绝对路径的问题,可能需要拼接基础URL。接下来,单独请求iframe的URL,获取内容,再对其进行解析数据提取。这里可能需要处理嵌套的iframe,即iframe里面还有iframe的情况,需要递归处理。 此外,还要考虑动态加载的iframe,有些iframe的src可能是通过JavaScript动态生成的,这时候普通的请求库如requests可能无法获取到正确的URL,需要用到无头浏览器如SeleniumPlaywright来渲染页面,执行JavaScript后获取实际的iframe URL。 另外,反爬虫机制也是一个需要考虑的因素。有些网站可能会在iframe中设置防盗链,检查Referer头,者需要特定的cookiesheaders才能访问iframe内容。这时,爬虫需要模拟浏览器的行为,携带必要的headerscookies。 还要注意法律道德问题,确保爬取iframe内容不违反网站的服务条款,尊重robots.txt的规则。 总结起来,处理iframe的爬虫策略主要包括以下几点: 1. 检测并提取iframe的URL。 2. 处理URL的路径问题(相对/绝对)。 3. 使用合适的工具获取iframe内容(静态用requests,动态用无头浏览器)。 4. 处理可能的反爬措施。 5. 递归处理嵌套iframe。 6. 遵守法律道德规范。 在写回答时,需要结构清晰,分点说明,可能还需要给出示例代码片段,比如用BeautifulSoup查找iframe标签,用requests获取内容,者用Selenium处理动态加载的情况。同时,提醒用户注意频率控制,避免被封IP,以及处理可能的验证码等问题。 需要确保LaTeX格式正确,但用户的问题中没有涉及数学公式,可能不需要使用。不过根据之前的系统级指令,所有行内数学表达式要用$...$,独立公式用$$...$$,但这里可能用不上,保持中文回答即可。 最后检查是否有遗漏点,比如iframe的安全设置(如X-Frame-Options头),可能会阻止页面被嵌入,这时候爬虫可能无法获取内容,需要处理这种情况,者寻找其他数据源。</think>### **iframe 的定义与作用** **iframe(内联框架)** 是 HTML 中的 `<iframe>` 标签,用于在当前页面内嵌入另一个独立的网页,形成“页面嵌套页面”的效果。其核心属性为 `src`,指向被嵌入页面的 URL。 **常见应用场景**: - 嵌入第三方内容(如地图、广告、视频播放器) - 实现模块化页面设计(如后台管理系统的菜单栏) - 跨域隔离(如安全沙箱环境) --- ### **iframe 对爬虫的挑战** 1. **内容隔离**:主页面与 iframe 内容分属不同 HTML 文档,直接解析主页面无法获取 iframe 内的数据。 2. **动态加载**:部分 iframe 的 `src` 可能由 JavaScript 动态生成,需执行脚本后才能获取真实 URL。 3. **嵌套结构**:可能存在多层 iframe 嵌套(如 iframe 内再套 iframe),需递归处理。 4. **安全限制**:部分网站通过 `X-Frame-Options` 响应头禁止被嵌入,通过 Referer 验证防盗链。 --- ### **爬取 iframe 内容的策略** #### **1. 定位 iframe 并提取 URL** - **步骤**: 1. 解析主页面 HTML,查找所有 `<iframe>` 标签。 2. 提取 `src` 属性值,注意处理相对路径(需拼接基础 URL)。 - **代码示例**(使用 BeautifulSoup): ```python from bs4 import BeautifulSoup import requests # 获取主页面 main_page = requests.get("https://example.com").text soup = BeautifulSoup(main_page, "html.parser") # 提取所有 iframe 的 src iframes = soup.find_all("iframe") for iframe in iframes: src = iframe.get("src") if not src.startswith("http"): src = "https://example.com" + src # 拼接基础 URL print("待抓取的 iframe URL:", src) ``` #### **2. 处理动态生成的 iframe** - **问题**:若 `src` 由 JavaScript 动态生成(如通过 AJAX 返回),需模拟浏览器执行脚本。 - **解决方案**:使用无头浏览器(如 **Selenium** **Playwright**)渲染页面后提取 `src`。 - **代码示例**(使用 Selenium): ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 等待 JavaScript 执行完成(可添加显式等待) iframe = driver.find_element("tag name", "iframe") src = iframe.get_attribute("src") print("动态生成的 src:", src) driver.quit() ``` #### **3. 抓取 iframe 内容** - **直接请求**:若 `src` 为静态 URL,直接通过 HTTP 请求获取内容。 - **代码示例**: ```python iframe_content = requests.get(src).text print("iframe 内容:", iframe_content) ``` #### **4. 处理嵌套与多层 iframe** - **递归策略**:对每个 iframe 内容重复上述步骤,检查是否包含新的 iframe。 - **代码示例**(递归函数): ```python def crawl_iframes(url): response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") iframes = soup.find_all("iframe") for iframe in iframes: src = iframe.get("src") # 处理路径拼接... print("抓取:", src) # 递归抓取嵌套内容 crawl_iframes(src) ``` #### **5. 绕过安全限制** - **Referer 验证**:在请求头中添加 `Referer` 字段,模拟合法来源。 ```python headers = {"Referer": "https://example.com"} response = requests.get(src, headers=headers) ``` - **Cookies 与认证**:若 iframe 需要登录,需携带主站的 Cookies Token。 --- ### **注意事项** 1. **性能优化**: - 避免频繁请求,合理设置延时(如 `time.sleep(2)`)。 - 对同一域名的 iframe 使用会话(`requests.Session()`)复用连接。 2. **反爬对抗**: - 随机化 User-Agent IP 代理池,防止被封禁。 3. **法律合规**: - 遵守 `robots.txt` 规则,避免抓取敏感禁止内容。 --- ### **总结流程** 1. **检测 iframe**:解析主页面,定位 `<iframe>` 标签。 2. **提取 URL**:处理 `src` 路径(静态动态)。 3. **抓取内容**:直接请求通过无头浏览器渲染。 4. **递归处理**:检查嵌套 iframe,直至获取全部数据。 5. **绕过限制**:模拟合法请求头、Cookies 及认证信息。 通过上述策略,可有效应对含 iframe 的网页结构,确保爬虫完整抓取目标数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值