1. 程式人生 > >iframe中跨域cookie丟失問題java解決

iframe中跨域cookie丟失問題java解決

     問題來源:

             兩個WEB專案整合,我的專案功能整合到一個大的WEB中,兩條線業務是獨立的所以最後就是用iframe的方式來完成整合。由於我這邊的專案是叢集的,就丟棄了session這種方式來儲存登入資訊的方式。才使用cookie+快取的方式來模擬session。在整合後釋出到線上沒有注意瀏覽器的問題,測試好了chrome和firefox後就驗收通過全面發版到線上。但是之後立馬接到使用者反饋,IE下大web中點選我的系統功能會跳轉到我這邊的登入介面(大web是通過簽名登入到我這邊系統的正常情況下是不會跳轉到登入介面的)。

    發現問題:

           在驗證chrome和firefox發現沒有問題後,問題定位到瀏覽器相容上。由於會跳轉到登入介面那肯定就是登入資訊失效或者是丟失了,由於預設登入有效時間是30分鐘,切在其他瀏覽器下都能正常工作那麼失效這種情況應該是排除的(快取在伺服器端),那麼應該就懷疑到登入資訊丟失上面了。果然對比chrome和IE發現小域名(我的系統)下的cookie裡面沒有了我的登入標示,那就找到問題了,cookie資訊丟失。

   尋找解決的辦法:

          既然知道了原因,那就尋找解決辦法,結果一搜索還真發現不少遇見相同問題的朋友,那就不多說了。由於IE 支援的P3P協議,會預設阻止第三方無隱私安全宣告的cookie,也就是在請求中不會在header中傳送(設定)cookie資訊。既然是阻止了,那我們讓它不組織不就解決問題了麼?那怎麼讓IE不組織呢?那就是在header宣告P3P就行了。那麼java中怎樣處理呢?不多說上原始碼。由於是web系統每個請求都可能出現這個問題,那怎樣同意解決呢?很簡單filter來解決。我們寫一個如下的 filter

public class DoP3pFilter implements Filter{
 @Override  public void init(FilterConfig filterConfig) throws ServletException {  }  @Override  public void doFilter(ServletRequest request, ServletResponse response,    FilterChain chain) throws IOException, ServletException {   System.out.println("write ie p3p filter .............");   HttpServletResponse res = (HttpServletResponse)response;
  res.setHeader("P3P", "CP=CAO PSA OUR");   if (chain != null){    chain.doFilter(request, response);    }  }  @Override  public void destroy() {  } } 在web.xml中做如下宣告  <filter>     <filter-name>p3p</filter-name>     <filter-class>com.xxx.filter.DoP3pFilter</filter-class>  </filter>   <filter-mapping>         <filter-name>p3p</filter-name>         <url-pattern>*</url-pattern>     </filter-mapping>
即可解決問題  <filter>     <filter-name>p3p</filter-name>     <filter-class>com.sicent.net0013app.web.p3p.filter.DoP3pFilter</filter-class>  </filter>   <filter-mapping>         <filter-name>p3p</filter-name>         <url-pattern>*</url-pattern>     </filter-mapping>