IE中iframe跨域丟失Session問題(續 p3p)

轉自:http://www.neatstudio.com/show-1390-1.shtml


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網站中寫入

PHP代碼
  1. <?php  
  2. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
  3. ?>  
這樣就能接受第三方的Cookie啦。

 

lighttpd的服務器

XML/HTML代碼
  1. server.modules    = ("mod_setenv")  
  2. 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代碼
  1. <VirtualHost>  
  2. Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'  
  3. </VirtualHost>  
IIS的服務器

增加一個網站http頭來解決問題;
管理工具——〉選擇一個網站——〉屬性——〉 http頭,增加一個http頭
然後輸入頭名:P3P
輸入頭內容:CP=CAO PSA OUR

jsp頁面:

XML/HTML代碼
  1. <%  
  2. response.setHeader("P3P","CP=CAO PSA OUR");  
  3. %>  
java代碼最簡單的辦法,增加一個filte:
Java代碼
  1. public class TransNameFilter extends HttpServlet implements Filter {  
  2. private static org.apache.commons.logging.Log logWriter =  
  3.    LogFactory.getLog(TransNameFilter.class.getName());  
  4.   
  5. /** 
  6. * 
  7. */  
  8. public TransNameFilter() {  
  9.    super();  
  10.   
  11. }  
  12. /* (非 Javadoc) 
  13.    * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
  14.    */  
  15. public void init(FilterConfig arg0) throws ServletException {  
  16.   
  17. }  
  18.   
  19. /* (非 Javadoc) 
  20. * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
  21. */  
  22. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  23.    throws IOException, ServletException {  
  24.   
  25.    HttpServletRequest hreq = (HttpServletRequest) request;  
  26.    String transName = hreq.getParameter("transName");  
  27.    if (Util.isNullOrEmpty(transName)) {  
  28.     logWriter.fatal(" there is no transName for this request");  
  29.    } else {  
  30.   
  31.     logWriter.info(" transName is " + transName);  
  32.    }  
  33.     
  34.    HttpServletResponse res = (HttpServletResponse) response;  
  35.         //iframe引起的內部cookie丟失  
  36.    res.setHeader("P3P","CP=CAO PSA OUR");  
  37.    if (chain != null)  
  38.     chain.doFilter(request, response);  
  39.   
  40. }  
  41.   
  42. /* (非 Javadoc) 
  43.    * @see javax.servlet.Filter#destroy() 
  44.    */  
  45. public void destroy() {  
  46.   
  47. }  
  48.   
  49. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章