项目使用iframe来组织页面内容,之前因为虽然业务发布在不同的服务,但是也都是一个大域名的不同子域名,最近新增了一个外部的域名就出现了SSO登录总是提示不成功退出。
解决的过程:
1. 首先是确定只有IE下有问题,Chrome下完全正常,就把精力从代码逻辑转移到浏览器兼容上来
2.发现只要是使用ie右键新窗口打开页面,就可以成功的SSO,直接点击在iframe中则必然失败,怀疑到iframe上
3. 输出SessionID发现有多个不同的SessionID,搜“iframe Session不一致”发现很多提到跨域的SSO遇到此类问题,解决方案为增加P3P头
4. 直接在一个测试的JSP页面里增加P3P测试后无效,用 http://www.w3.org/P3P/validator.html http://www.w3.org/P3P/ 检测发现页面并没有输出P3P
5. 增加过滤器为页面设置P3P,测试,通过
以下为过滤器代码:
来源: http://blog.csdn.net/wdh226/article/details/6045337
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TransNameFilter extends HttpServlet
implements Filter
{
private static Log logWriter = LogFactory.getLog(TransNameFilter.class.getName());
public void init(FilterConfig arg0)
throws ServletException
{
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest hreq = (HttpServletRequest)request;
String transName = hreq.getParameter(“transName”);
HttpServletResponse res = (HttpServletResponse)response;
res.setHeader(“P3P”, “CP=CAO PSA OUR”);
if (chain != null)
chain.doFilter(request, response);
}
public void destroy()
{
}
}
发表评论