2

下面的 P3PsetHeader代码存在于我的 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。

标头中是否需要policref?我应该为我的域设置 p3p 策略吗?

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

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

4

3 回答 3

4

首先是简短的回答:)

您可以简单地添加标题

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

长答案

不久前我也遇到了同样的问题。可能就像您一样,我已经完成了我的功课,并且对 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/

值得注意的 SO 问题

Cookie 被阻止/未保存在 Internet Explorer 的 IFRAME 中

P3P 政策无法在 IE 中允许 3rd 方 cookie

尽管如此,我仍然未能使其正常工作。我没有意识到,在这本神奇的书的帮助下我最终学到的是,引用

为了为 Internet Explorer 用户设置第三方 cookie(使用默认安全设置),您需要在您的资源中返回一个特殊的 P3P HTTP 标头,以声明您的服务打算如何使用用户数据。此标头需要与您的资源的所有HTTP 响应一起返回,而不仅仅是那些设置 cookie 的响应。这意味着静态资源、AJAX 端点、iframe——一切。

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

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

IE没有将compact策略与full-format policy进行比较,full-format policy不需要

这在我的测试中被证明是正确的。这意味着您可以简单地将标题添加为

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>
于 2015-02-13T22:49:05.263 回答
0

基本上只需像这里 http://www.muneebahmad.com/index.php/archives/56一样编写过滤器 并使用

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

然后只需将其映射到您希望添加此标头的 URL 或全部使用/*

或者

在这里,您将找到几乎相似的问题和已接受的答案,并附有详细示例代码。

https://stackoverflow.com/questions/6121212/how-to-generate-and-deploy-p3p-privacy-policy-in-struts2-java

希望它会有所帮助。!

于 2015-02-20T13:36:14.967 回答
0

这可能会有所帮助,请尝试使用以下代码修改您的代码:

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

也看看这个:

https://msdn.microsoft.com/en-us/library/ms537343(v=vs.85).aspx#unsatisfactory_cookies

于 2015-02-17T07:44:44.060 回答