IE中iframe跨域Session丢失问题

来源:互联网 发布:黑马 软件测试培训 编辑:程序博客网 时间:2024/04/29 11:10

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啦。


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>

同一服务器,A为域名,B为ip,A通过iframe嵌入B,需要对域名和ip的VirtualHost都设置Header set P3P



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'")


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() {

}

}