IE下iframe跨域session和cookie失效问题的解决方案

问题来源:
何为跨域跨域session/cookie?

也就是第三方session/cookie。第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion/cookie, 会被存储在访客的计算机上。第三方session/cookie指的是当前访问的网站中会加载(嵌入)另外第三方的网站代码,例如促销广告,那么第三方网站也会在访客的计算机上添加session/cookie,这种就是第三方session/cookie。

IE限制第三方session/cookie

随着IE版本的不断更新,版本之间变化很大,其兼容性问题困扰着许多开发者。本问题也不例外,IE7以后,微软逐渐改进了IE安全性,其中默认设置下第三方session/cookie是不允许使用的,这就造成了使用iframe嵌入式访问另外的第三方网站时,不能为其保存会话状态,无法进行登录或跨越取值,从而影响第三方网站功能的使用。

解决方法

手动调整客户端IE浏览器的安全级别

在Internet选项-隐私卡中,调低安全级别到接受所有cookie,或者在[高级]中设置接受第三方cookie。

点评:此方法需要使用者更改客户端浏览器设置,极不便利,且会给使用者电脑带来安全隐患,故不推荐。

代码中使用P3P协议自动更改IE浏览器安全级别

P3P(Platform for Privacy Preferences)是一种可以提供这种个人隐私保护策略。具体做法是在被iframe嵌入的第三方网站代码中加入如下代码: 

[java]  view plain copy
  1. response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");  

要注意的有:

1、上段代码是jsp的,如果是asp或php等,需要改成相应的语法,参数和取值不变。如ruby为:

[ruby]  view plain copy
  1. response.headers["P3P"] = "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""  

2、此方法仅支持动态Web应用,也就是需要使用动态语言设置response的header,且如果是MVC架构的话,最好是在总控制器或过滤器中添加上段代码,这样改动最小。

点评:该方法不需要手动修改客户端IE设置,但需要修改第三方网站的代码,对于第三方网站不在控制范围内情况下无能为力。

在第三方网站服务器中设置P3P协议

第三方网站所使用的应用服务器程序,如果支持设置HTTP头,那么可以通过设置服务器而不必修改第三方网站代码。

例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头

然后输入头名:P3P

输入头内容:CP=CAO PSA OUR

点评:与上一个方法类似,此方法也要求第三方在可控可管理。

Spring Boot 跨域Session Cookie失效问题的解决方法如下: 首先,跨域问题可以通过配置Spring Boot的CORS(跨源资源共享)来解决。在Spring Boot中,可以使用注解 `@CrossOrigin` 或在配置类中添加 `addCorsMappings` 方法来配置跨域的访问。 @CrossOrigin 注解可以应用在控制器类或方法上,指定允许跨域的来源、方法、头部、是否允许携带凭证(比如 Cookie)等参数。例如: ```java @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600, allowCredentials = "true") @GetMapping("/example") public ResponseEntity<String> getExample() { // ... } ``` 另一种配置跨域的方法是创建配置类,并继承 `WebMvcConfigurer` 接口,并重写其 `addCorsMappings` 方法。例如: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST") .allowCredentials(true) .maxAge(3600); } } ``` 其次,Session Cookie失效问题可以通过在跨域请求中添加凭证(Credentials)来解决。具体来说,可以将 `allowCredentials` 参数设置为 `true`,同时在请求头中添加 `withCredentials: true`。例如: ```javascript fetch('http://localhost:8080/api/example', { method: 'GET', credentials: 'include' // 或 'same-origin' }) ``` 这样配置后,Spring Boot就可以正常接收带有 Cookie跨域请求,并在服务端保持 Session 的有效性。 综上所述,通过配置跨域设置和同时在请求中添加凭证,可以解决Spring Boot跨域Session Cookie失效问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值