解决跨域导致session丢失以及多OPTIONS请求问题

解决跨域导致session丢失以及多OPTIONS请求问题。
正常来讲,在服务器端允许跨域,只需设置如下即可:

response.setHeader("Access-Control-Allow-Origin", "*"); 
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 

但是跨域时,session会引起丢失,express里每次给客户端发放cookie后,客户端都反不回来,所以,每次都像是一个新的提交。所以跨域的设置第一行应改为如下:
res.header("Access-Control-Allow-Origin", "http://192.168.1.240"); //不能为*了,必须指定
response.setHeader("Access-Control-Allow-Credentials","true"); //是否支持cookie跨域

相应Angular4中在发起请求时,也应该在头部如下设置:

let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'});
let options = new RequestOptions({headers: headers, withCredentials: true});
return this.http.post(submitUrl, params, options)....

参考如下:
angular跨域和session失效问题

OPTIOP请求问题,因为跨域,在RFC文档中有说明,客户端会先发起一个OPTIONS请求,因为我们的POST请求的头部表明了Content-Type类型是application/json,不是以下之一:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

所以会引起OPTIONS请求,经过我不断尝试,还是没有达到我请求类型为application/json,而不发起OPTIONS请求的目的,所以最终正常将请求类型改为application/x-www-form-urlencoded,这样一来,我客户端的payload序列化后就变成了属性名,我只能在服务器端取到这个属性名再反序列化。

http.post(submitUrl, params, options) // params即是序列化后的json对象

服务器端

var mybody = req.body;
for(var key in mybody){
    break;
}
var params = JSON.parse(key); // params 即是反序列化后的json对象

我知道很恶心,但是只能暂时这样。

相关阅读及参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 浏览器在请求不同域的资源时,会因为同源策略的影响请求不成功,这就是通常被提到的“跨域问题”。作为前端开发,解决跨域...
    SCQ000阅读 7,434评论 1 52
  • 1. 所谓跨域 跨域是一种浏览器同源安全策略,也即浏览器单方面限制脚本的跨域访问。很多人可能误认为资源跨域时无法请...
    blurooo阅读 11,329评论 11 54
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,020评论 19 139
  • 1、同源策略 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。 一个源的定义:如果协议,端口...
    wengjq阅读 10,373评论 3 16
  • 题目:将一个列表的数据复制到另一个列表中。方法一: 方法二: 方法三: 方法四:
    我是怪人我也不美阅读 1,643评论 0 0

友情链接更多精彩内容