各语言框架嵌套session丢失问题解决

    技术2025-09-22  69

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

    PHP代码 <?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代码 <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页面:

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

    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的服务器
    最新回复(0)