整合客户的登录时,或者其他一个网站通过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网站中写入
<?php header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"') ?>
这样就能接受第三方的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的服务器
增加一个网站http头来解决问题;
管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头
然后输入头名:P3P
输入头内容: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() { } }