一、IE浏览器iframe跨域丢失Session问题html
在开发中,咱们常常会遇到使用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()为好java
除了Ifrmae有丢Session问题外,frameset也有一样的问题Frameset的问题更不肯定,是有时会丢,有时不会丢,这更认人头痛,在网上找到了一个方法,在页面page_onload里添加一语句:
Response.AddHeader("P3P","CP=CAO PSA OUR");
FrameSet中的Session丢失问题就解决了至于里面具体的缘由 也没时间去搞懂了sql
最简单的方法就是在iis里设置跨域
解决办法浏览器
response.addHeader("P3P","CP=CAO PSA OUR")。安全
不过难道咱们须要在每一个页面都加这个么?服务器
不须要的cookie
若是有权配置IIS服务器session
打开IISapp
管理工具——〉选择一个网站——〉属性——〉http头,增长一个http头
而后输入头名:P3P
输入头内容:CP=CAO PSA OUR
若是没有权限配置IIS服务器,可是你用的是asp.net的话
能够用httpmodual来实如今所有页面或者部分页面头部插入所须要的标志
本站点的某个目录就是这样实现的
二、用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"
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/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