Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148353
  • 博文数量: 44
  • 博客积分: 2330
  • 博客等级: 大尉
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 11:57
文章分类
文章存档

2012年(6)

2011年(32)

2010年(6)

分类: LINUX

2012-04-18 14:04:43

iframe里ie8的cookie问题 p3p

January 15, 2012 常见问题 人关注 No Comments

a站点iframe嵌入b站点的页面,但是被ie8阻止了cookie,java代码设置heade没用,配置了apache httpd。conf才解决,原文如下:





P3P,不算是新名词,但还是有些人不清楚。事实上我也不清楚。。。在百度上看到有这玩意就备份下来。说真的,我只是知道用,但不知道为什么用。额。。很明显,因为在ucenter同步的时候,在discuz的ui/api里有写过。

看内容吧。。。。

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网站中写入 小眼世界ýñ ëÕRÏz-Z 

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的服务器 


XML/HTML代码 
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的服务器 

XML/HTML代码
< VirtualHost >    
Header set P3P 'CP = "CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" '   
    
IIS的服务器 小眼世界ýñ ëÕRÏz-Z 

增加一个网站http头来解决问题; 小眼世界ýñ ëÕRÏz-Z 
管理 工具——〉选择一个网站 ——〉属性——〉 http头,增加一个http头 小眼世界ýñ ëÕRÏz-Z 
然后输入头名:P3P 小眼世界ýñ ëÕRÏz-Z 
输入头内容:CP=CAO PSA OUR

jsp页面: 

XML/HTML代码
< %   
response.setHeader("P3P","CP = CAO  PSA OUR");   
%>    
java代码最简单的办法,增加一个filte: 
Java代码
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() {   
   
}   
   
}  
阅读(2794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~