`
风沙星辰
  • 浏览: 56205 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

iframe跨域访问cookie、Sessio

    博客分类:
  • java
阅读更多

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.csdn.net/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"

另外这里还有一个P3P的验证工具:http://www.w3.org/P3P/validator.html,可以验证一下自己设置的P3P是否正确。

这里还有一个老外写的不错的blog,也可以参考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2
分享到:
评论

相关推荐

    iframe 跨域访问session

    `iframe` 跨域访问`session`正是为了解决这一问题。 首先,让我们了解一下`session`和`cookie`的关系。`session`通常用于存储用户登录状态等临时信息,而`cookie`则作为`session` ID的载体在客户端和服务器之间传递...

    关于Iframe如何跨域访问Cookie和Session的解决方法

    本文主要探讨如何解决Iframe跨域访问Cookie和Session的问题。 首先,理解跨域访问的基本概念。在Web浏览器的安全策略中,同源策略(Same-origin policy)禁止了一个源(协议+域名+端口)的文档或脚本直接获取另一个...

    iframe跨域与session失效问题的解决办法

    何为跨域跨域session/cookie? 也就是第三方session/cookie。第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion /cookie, 会被存储在访客的计算机上。第三方session/cookie指的是当前访问的...

    【ASP.NET编程知识】iframe跨域与session失效问题的解决办法.docx

    跨域是指第三方 Session/Cookie,也就是在当前访问的网站中加载(嵌入)另外第三方的网站代码,例如促销广告,那么第三方网站也会在访客的计算机上添加 Session/Cookie。第一方 Session/Cookie 指的是访客当前访问的...

    PHP关于IE下的iframe跨域导致session丢失问题解决方法

    总的来说,针对IE浏览器中iframe跨域导致Session丢失的问题,关键在于理解浏览器对跨域Cookie的处理方式,特别是IE的独特限制。通过设置P3P头,可以通知浏览器允许iframe内的页面使用和共享Session,从而修复登录和...

    iframe跨域嵌套自适应高度

    ### iframe跨域嵌套自适应高度 在网页开发过程中,`iframe`作为一种常见的网页元素,被广泛用于在当前页面中嵌入另一个独立的文档或页面。然而,在实际应用中经常会遇到一些问题,如跨域限制、自适应高度调整以及...

    PHP实现cookie跨域session共享的方法分析

    这个过程利用了iframe的同源策略例外,以及JavaScript的跨窗口通信能力,实现了跨域Cookie的共享。 ### Session共享 Session共享通常用于同一服务器下的多个应用间,或分布式服务器环境。PHP本身并不支持跨服务器...

    php中http与https跨域共享session的解决方法

    - **使用HTTPOnly Cookie**:设置Cookie的HTTPOnly属性,防止JavaScript代码访问Cookie,减少XSS攻击的风险。 总结: 在PHP中处理HTTP和HTTPS跨域Session时,开发者需要手动管理Session ID的传递,同时关注安全问题...

    跨域页面访问问题解决.doc

    跨域页面访问问题是指在多个系统集成的情况下,主系统以 iframe 或 frameset 的方式将其他子系统的页面嵌进来,导致浏览器阻止 iframe 或 frameset 的 cookie,进而使 SESSION 失效。解决办法是,在子系统的登录代码...

    浅谈Ajax跨域Session和跨域访问

    三、Session与跨域访问 Session是服务器端存储用户状态的一种方式,通常与特定的浏览器会话关联。当用户在某个域(例如A.com)下登录并创建了Session,然后在另一个域(例如B.com)进行Ajax请求时,B.com无法直接...

    ajax跨域访问遇到的问题及解决方案

    **Ajax跨域访问** 是一个常见的前端开发中遇到的问题,主要涉及到浏览器的同源策略限制。同源策略是指,浏览器的JavaScript代码只能访问与当前页面同协议、同域名、同端口的资源,以防止恶意脚本从一个站点窃取另一...

    Iframe的页面,判断是否登录的时候有时候有问题就需要

    3. **统一登录状态管理**:利用Cookie、Session或现代前端框架(如React、Vue)的状态管理库(如Redux、Vuex),可以在整个应用程序范围内统一管理和维护用户的登录状态。 4. **友好的错误处理**:设计合理的错误...

    完整可行、浏览器兼容、通过测试的Iframe高度自适应程序

    - 如果Iframe加载的内容与主页面不在同一域名下,浏览器的安全策略会阻止访问其内容,导致高度无法正确获取。解决跨域问题通常需要在Iframe的源站点设置CORS(跨源资源共享)头或者使用`postMessage`进行跨域通信。...

    php实现多站点共用session实现单点登录的方法详解

    利用`iframe`标签,请求其他站点的`set_cookie.php`,将接收到的Session ID设置为当前的Session ID。 2. **数据库存储Session信息**:由于不同服务器无法直接共享Session文件,我们可以将Session信息存储在数据库中...

    页面间传值

    每个网页访问时,浏览器都会自动携带对应的Cookie信息。不过,由于大小限制(通常4KB)和隐私问题,Cookie并不适合存储大量或敏感数据。 3. Session: Session是服务器端存储用户状态的一种方式。当用户登录后,...

    各个软件公司面试题答案

    - A、B、C、D选项描述了IFrame的特性,如嵌入内容、跨域限制、尺寸调整等。 6. 表格元素: - A、B选项正确描述了表格结构。 7. Window对象: - A、B、C选项正确描述了window对象的方法和属性。 8. DIV与SPAN的...

    阿里前端面试(含答案)1

    使用HttpOnly属性可以防止JavaScript访问Cookie,减少XSS攻击中窃取Cookie的风险。 19. **Cookie与Session的区别** Cookie存储在客户端,大小和数量有限,易于被窃取;Session存储在服务器端,更安全,但会增加...

    jsessionid存在的问题及其解决方案

    在Web开发中,`jsessionid`是一个常见的概念,它关联到Java服务器会话(Session)的管理。本文将深入探讨`jsessionid`存在的问题以及相应的解决方案,并结合提供的`DisableUrlSessionFilter.java`和`web.xml`文件来...

Global site tag (gtag.js) - Google Analytics