Tomcat、JAVA、Iframe、P3P跨域

来源:互联网 发布:linux修改root密码命令 编辑:程序博客网 时间:2024/06/02 01:10

 

转自:http://howe.im/编程/tomcat、java、iframe、p3p跨域.html

 

项目使用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,测试,通过

以下为过滤器代码:

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

 

原创粉丝点击