jsp - IE8 的 P3P 设置 header 似乎不起作用

标签 jsp header cas p3p

下面的 P3P setHeader 代码存在于我的 CASresponse jsp 中,但似乎不起作用,

response.setHeader("P3P","policyref=\"http://sso.mydomain.net/w3c/p3p.xml\", 
CP=\"CAO IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

我在这里遗漏了什么吗?我无法在 IE8 中获取第三方 cookie。

header 中是否需要有poliref?我应该为我的域设置 p3p 策略吗?

既然它是一个 CAS 请求,我应该在所有请求都进入 CAS 时设置它吗?假设我有entryFilter.java,我应该在那里设置P3P header 吗?或者在 cookie 创建之后。

当 IE 执行 302 重定向到我的 serviceUrl 时,我无法保留 cookie。

最佳答案

首先是简短的答案:)

您可以简单地添加标题

response.setHeader("P3P", "CP=\"CAO IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

但是由于您需要所有资源的 header ,所以最好使用过滤器

public class P3PFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) res;
        resp.addHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
        filterChain.doFilter(req, resp);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}

长答案

不久前我也遇到了同样的问题。可能就像您一样,我已经做了功课,并对 P3P 策略是什么以及如何使用它有了一定的了解。我当时引用的是

官方链接

http://www.w3.org/P3P/

http://p3ptoolbox.com/guide/

著名博客

http://www.marco.org/2007/04/27/p3p-sucks-how-to-get-frame-cookies-unblocked-in-ie6

http://www.techrepublic.com/blog/software-engineer/craft-a-p3p-policy-to-make-ie-behave/

值得注意的问题

Cookie blocked/not saved in IFRAME in Internet Explorer

P3P Policy not working to allow 3rd party cookies in IE

尽管如此,我仍然未能使其正常工作。我没有意识到,但我最终在 amazing book 的帮助下了解到的是,引用

in order to set third-party cookies for Internet Explorer users (with default security settings), you need to return a special P3P HTTP header with your resources that declares how your service intends to employ user data. This header needs to be returned with ALL HTTP responses for your resources, not just those that set cookies. This means static resources, AJAX endpoints, iframes—everything.

我怀疑这也可能是您的问题,我使用的 P3P 政策与您的几乎完全相同,因此您不会因无效政策而被拒绝。

我将没有 URL 的 header 设置为 p3p 策略,如 techrepublic 博客中所述

IE does not compare the compact policy to the full-format policy, and the full-format policy is not needed

这在我的测试中已被证明是正确的。这意味着您可以简单地添加 header ,如下所示

response.setHeader("P3P", "CP=\"CAO IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

但是,当您在所有响应中都需要它时,最好编写一个过滤器,例如

public class P3PFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) res;
        resp.addHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
        filterChain.doFilter(req, resp);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}

并对所有请求应用过滤器。

<filter>
    <filter-name>P3P Filter</filter-name>
    <filter-class>your.package.P3PFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>P3P Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

关于jsp - IE8 的 P3P 设置 header 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445739/

相关文章:

使用百分号的Java属性文件 "%"

jsp - Struts2 java.lang.NoSuchMethodException(表单值类型)

java - 自动提交错误表的最大值

javascript - 启用 JSP 文件中包含的 Javascript、CSS 文件的缓存

c++ - 多个包含在多个文件中

c - 删除 TCP、IP 和以太网 header 后,从数据包中获取 HTTP header

c - 整理代码 - 将辅助函数隐藏在不同的文件中

spring - 使用 Spring Security 和 CAS 进行单点注销

debugging - 仅对 Tomcat 7 上的 CAS (jasig) 类激活 DEBUG

java - 在 AbstractJdbcUsernamePasswordAuthenticationHandler 中获取 Request 对象