整合客戶的登錄時,或者其他一個網站通過iframe時,特別是一個http頁面,訪問一個https頁面時,常常會session失效!
1、由於IE的安全限制,將父面所在域加入信任站點就OK了!
2、當“父”頁面是https的,通過iframe去訪問https頁面時,
<iframe name="loginFrame" id="loginFrame" frameborder=NO scrolling=NO src="" class="iframeBody" ></iframe>
會報“有不安全的信息”
辦法是: src="/" 就OK!
3、當客戶設置了1時,還是不行時,怎麼辦呢? 又查詢了一些網上的資料!
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啦。
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'")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>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() {
}
}