跨域访问Nodejs,ie获取不到cookie

跨域访问Nodejs,ie获取不到cookie

php通过ajax访问nodejs,生成cookie,在chrome,firefox里正常,但是在ie里获取不到 可以通过设置ie隐私,接受所有cookie解决

enter image description here

查了下原因,应该跟这个类似 http://blog.csdn.net/sunqinye/article/details/7849074

就是IE加入了以PlatformforPrivacyPreferences(P3P)为基础的 隐私保护功能,阻止第三方cookie,当第三方站点试图读写cookie时,IE就会自动拦截。

解决办法: php的话,加上: header(‘P3P: CP=CAO PSA OUR’);

ASP.NET的话,加上: Response.AddHeader(“P3P”, “CP=CAO PSA OUR”)或者在Window服务中将ASP.NET State Service 启动。

JSP: response.setHeader(“P3P”,“CP=CAO PSA OUR”)

ASP直接在头部加了头部申明: <%Response.AddHeader “P3P”, “CP=CAO PSA OUR”%>

那这个在nodejs里怎么解决呢????


4 回复

跨域访问Nodejs,ie获取不到cookie

在使用Node.js处理跨域请求时,遇到Internet Explorer(IE)无法获取到Cookie的问题。这种情况通常与IE的隐私保护策略有关,特别是它对P3P(Platform for Privacy Preferences)的支持。

原因

IE加入了以P3P为基础的隐私保护功能,阻止第三方Cookie。当第三方站点试图读写Cookie时,IE会自动拦截这些操作。因此,如果您的应用在跨域环境下运行,可能会遇到这个问题。

解决方案

在Node.js中,您可以通过在响应头中添加P3P策略来解决这个问题。以下是一个简单的示例代码:

const express = require('express');
const app = express();

app.use((req, res, next) => {
    // 添加P3P策略头
    res.set("P3P", "CP=CAO PSA OUR");
    next();
});

app.get('/api/data', (req, res) => {
    // 设置Cookie
    res.cookie('sessionId', '123456789', { httpOnly: true });
    res.json({ message: 'Data fetched successfully' });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

示例解释

  • P3P策略头res.set("P3P", "CP=CAO PSA OUR");

    • 这行代码用于在HTTP响应头中添加P3P策略。CP=CAO PSA OUR表示允许第一方和第三方Cookie。
  • 设置Cookieres.cookie('sessionId', '123456789', { httpOnly: true });

    • 这行代码用于设置一个名为sessionId的Cookie,并将其值设为123456789httpOnly选项确保Cookie只能通过HTTP访问,不能通过JavaScript访问,以提高安全性。

注意事项

  • 如果您的应用需要在多个域名之间共享Cookie,确保在P3P策略中正确配置。
  • 在生产环境中,确保遵循最佳实践来保护用户数据的安全性。

通过上述方法,您可以在Node.js应用中解决IE跨域访问时无法获取Cookie的问题。


在node里有一个方法是response.setHeader(),你可以试一下

谢谢,搞定了,我用的express

res.setHeader("P3P","CP=CAO PSA OUR");

对于Node.js来说,解决跨域访问时IE无法获取cookie的问题,可以通过在服务器端设置P3P策略来实现。以下是如何在Express框架中添加P3P头的例子。

示例代码

假设你正在使用Express框架:

const express = require('express');
const app = express();

app.use((req, res, next) => {
    // 添加 P3P 头
    res.header('P3P', 'CP="CAO PSA OUR"');
    next();
});

app.get('/your-endpoint', (req, res) => {
    // 设置cookie
    res.cookie('myCookie', 'value', { httpOnly: true, secure: false });
    res.send('Cookie has been set.');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 中间件:在你的应用中使用一个中间件函数,它会在每个请求到达目标路由之前运行。这里我们用res.header方法来添加P3P头。

  2. 设置Cookie:在实际的路由处理函数中,你可以像往常一样设置Cookie。注意httpOnlysecure标志,这取决于你的应用场景。

  3. P3P策略:设置'P3P': 'CP="CAO PSA OUR"'为你的响应头,以确保IE浏览器能够正确处理来自第三方源的Cookie。

这样配置后,IE应该能够正常接收并处理跨域请求中的Cookie了。如果你的应用不是基于Express框架的,只需确保你的服务器响应包含适当的P3P头即可。

回到顶部