2009-09-21 21:25
我用的是java程序,在jsp页面加入
<%
response.setHeader("P3P","CP=CAO PSA OUR");
%>
整合客户的登录时,或者其他一个网站通过iframe时,特别是一个http页面,访问一个https页面时,常常会session失效!
1、由于IE
的安全限制,将父面所在域加入信任站点就OK了!
2、当“父”页面是https的,通过iframe
去访问https页面时,
<iframe name="loginFrame" id="loginFrame" frameborder=NO scrolling=NO src="" class="iframeBody" ></iframe>
会报“有不安全的信息”
办法是: src="/"
就OK!
3、当客户设置了1时,还是不行时,怎么办呢?又查询了一些网上的资料!
IE6/IE7支持的P3P(Platform for Privacy
Preferences Project (P3P)
specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存
在此问题了。
在frameset里面,也就是里面的frame是来自第三方站点(不同IP或
不同域名),那么默认情况下IE会自动禁用这些站点的cookie,也就是在请求某url时在HTTP
header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏
览器的。
在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe
指向b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。 所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.
解决方案.
PHP
的程序
可以直接在B网站中写入www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
<?phpwww.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
?>www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
这样就能接受第三方的Cookie啦。
lighttpd的服务器
server.modules = ("mod_setenv")
setenv.add-response-header = ( "P3P"
=> "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM
NAV OTC NOI DSP COR'")
apache的服务器
<VirtualHost>
Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'
</VirtualHost>
IIS的服务器
www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
增加一个网站http头来解决问题;www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
管理
工具——〉选择一个网站
——〉属性——〉http头,增加一个http头www.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
然后输入头名:P3Pwww.kobsky.cn 小眼世界ýñ ëÕRÏz-Z
输入头内容:CP=CAO PSA OUR
jsp页面:
<%
response.setHeader("P3P","CP=CAO PSA OUR");
%>
java代码最简单的办法,增加一个filte:
public class TransNameFilter extends HttpServlet implements Filter {
private static org.apache.commons.logging.Log logWriter =
LogFactory.getLog(TransNameFilter.class.getName());
/**
*
*/
public TransNameFilter() {
super();
}
/* (非 Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
}
/* (非 Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) request;
String transName = hreq.getParameter("transName");
if (Util.isNullOrEmpty(transName)) {
logWriter.fatal(" there is no transName for this request");
} else {
logWriter.info(" transName is " + transName);
}
HttpServletResponse res = (HttpServletResponse) response;
//iframe引起的内部cookie丢失
res.setHeader("P3P","CP=CAO PSA OUR");
if (chain != null)
chain.doFilter(request, response);
}
/* (非 Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}
转自:http://wwww.iteye.com/blog/420145
分享到:
相关推荐
针对IFrame中Session丢失的问题,可以采取以下几种策略: 1. **使用StateServer模式管理Session:** 在Web.Config文件中配置`sessionState`元素,设置`mode`属性为`StateServer`,并指定`stateConnectionString`,...
总的来说,针对IE浏览器中iframe跨域导致Session丢失的问题,关键在于理解浏览器对跨域Cookie的处理方式,特别是IE的独特限制。通过设置P3P头,可以通知浏览器允许iframe内的页面使用和共享Session,从而修复登录和...
通过这种方式,可以解决在IE浏览器中由于P3P隐私设置导致的iframe跨域cookie丢失问题,进而解决session失效导致的用户频繁重新登录的问题。这个方法在技术上是可行的,但需要网站管理员操作,确保P3P声明符合实际的...
出于隐私安全的考虑,IE 会丢失 Iframe 中的 Cookie,IE6/IE7 支持的 P3P(Platform for Privacy Preferences Project specification)协议默认阻止第三方无隐私安全声明的 Cookie,Firefox、Chrome 不存在此问题。...
在Web开发中,Iframe(内联框架)常用于嵌入其他网页内容,但涉及到跨域访问时,尤其是在处理Cookie和Session时,会遇到一些挑战。本文主要探讨如何解决Iframe跨域访问Cookie和Session的问题。 首先,理解跨域访问...
本文将详细介绍如何实现`iframe`跨域嵌套下的自适应高度调整,并讨论如何解决因跨域嵌套而可能引起的`session`丢失问题。 #### 一、`iframe`自适应高度原理与实现 1. **基本概念**: - **`iframe`**:`iframe`即...
首先登陆成功时将用户存在session中,后续请求在将用户从session中取出检查。后续请求取出的用户都为null。 解决过程: 首先发现sessionID不一致,导致每一次都是新的会话,当然不可能存在用户了。然后发现cookie...
- **PHP在IE下的iframe跨域session丢失问题**:由于浏览器同源策略,跨域会导致会话丢失,可以通过设置 P3P 头部或使用共享域名的 cookie 来解决。 - **Failed to write session data** 错误:这通常是因为临时...