xhr

先来了解下xhr

xhr,全称为XMLHttpRequest,用于与服务器交互数据,是ajax功能实现所依赖的对象,jquery中的ajax就是对 xhr的封装。

还有axios和fetch请求都属于xhr请求,都是基于标准 Promise 实现。

ajax cookie跨域处理

简单说说cookiesession的关系

不少朋友搞的不是特别清楚,一知半解的,在这里阐述下

cookie存储于客户端浏览器,默认生命周期跟随浏览器,浏览器关闭,cookie就会失效,tab标签也关闭了并不会失效

session存储于服务器,比如tomcat,默认失效时间30分钟,当然也可以通过redis来存储。

这里登录做个示例说明

未登录状态下,匿名用户通过客户端浏览器请求数据,都是无状态的(服务端不知道你是谁

用户进行请求登录操作,登录成功,服务端会在response header里加一个Set-Cookie写入浏览器中。

之后客户端在以后的请求中,会自动在请求头中携带此cookie。

cookie有一些属性,比如

  • 失效时间(跟随浏览器,但是也可以进行持久化。跟localstorage和sessionstorage类似)

  • httponly(设置为true的话,客户端在控制台就获取不到)

  • path(默认为/)

同源情况下,比如是前后端不分离的项目,xhr(ajax)请求没有任何问题,但是会发现,不支持cookie跨域

非同源情况下,xhr(ajax)请求服务端处理了,但是不会进行响应,会显示如下错误。也就是出现了跨域问题。

所以,解决接口跨域和解决xhr cookie跨域,是不一样的。

解决cookie跨域需要客户端和服务端都做处理,主要操作在服务端。

客户端

ajax请求添加该参数即可

xhrFields: {
withCredentials: true
},

同理axios也是如此

axios.defaults.withCredentials = true

注意,修改cookie值直接document修改即可,请求的时候浏览器会自动携带的。

不需要在header中添加cookie头,这样做是没有任何意义的。比如

headers: {
'Cookie': 'JSESSIONID=6FA9E27092EC212E439851D4831AADE6'
}

服务端

添加允许跨域操作,此处表示Spring框架,直接用@CrossOrigin处理即可(最为简单)

@CrossOrigin(value = "*", allowCredentials = "true")

服务端设置跨域的几种方式

方式一 重写addCorsMappings方法

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}

方式二 对单个接口处理

// 需要设置前端请求的url。不支持*
responses.setHeader("Access-Control-Allow-Origin", "http://localhost:63342");
// 设置允许跨域的方法
responses.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
// 之后需要设置允许cookie跨域
response.setHeader("Access-Control-Allow-Credentials", "true");

方式三 @CrossOrigin注解

@CrossOrigin(value = "*", allowCredentials = "true")

方式四 nginx配置添加允许跨域请求

server {
listen 5566;
server_name localhost;
# 指定客户端的请求地址
add_header 'Access-Control-Allow-Origin' 'http://localhost:63342';
add_header 'Access-Control-Allow-Credentials' true;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization,token,r,sign,time"; location / { if ($request_method = OPTIONS ) {
return 200;
} proxy_method get; proxy_set_header X-real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:5005;
proxy_set_header Host $host;
} }

OK,完美解决!

Ajax请求携带Cookie的更多相关文章

  1. ajax请求携带 cookie

    之前都有这样一个理解:ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须哟啊设置withCredential为true.这个说法会让人产生完全扭曲的误解,我就是其中之一.完整的无歧义 ...

  2. 跨域ajax请求携带cookie

    通过withCredentials 方式: getCompanySubject: function () { return axios.get(this.apiUrls.getCompanySubje ...

  3. ajax请求携带cookie和自定义请求头header

    参考链接:https://blog.csdn.net/menghuanzhiming/article/details/102736312

  4. 关于 Angular 跨域请求携带 Cookie 的问题

    在前端开发调试接口的时候都会遇到跨域请求的问题.传统的方式是使用 Nginx 反向代理解决跨域.比如所有接口都在 a.com 的域下,通过 Nginx 将所有请求代理到 a.com 的域下即可. 使用 ...

  5. 关于axios请求携带cookie以及封装

    axios跨域携带cookie需要配置 axios跨域发送请求的时候默认不会带上cookie的 + withCredentials的情况下,后端要设置Access-Control-Allow-Orig ...

  6. 跨域请求携带cookie

      function ajaxPostRequestCipherMachine(url, param) { var url = url; var dict = { 'ret' : false, 'er ...

  7. 怎样实现跨域AJAX请求发送Cookie

    第一步: 服务器必须在Response Header中设置: Access-Control-Allow-Credentials: true 第二步: 客户端发起请求时需要将 xhr.withCrede ...

  8. jquery中$.get()如何让跨域请求携带cookie?

    在这个get请求前面加上这个就好了~~~~

  9. postman发送请求携带Cookie

    相关步骤: 1.下载 Postman-Interceptor_v0.2.24.zip插件 2.解压下载好的插件,将其拖到应用配置中 3.复制Postman-Interceptor_v中的id地址 4. ...

随机推荐

  1. c语言学习笔记之结构体存储

    今天讲讲结构体存储问题 首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和 例如 我们可能会觉得是 结构体大小=int(4个字节)+ short(2个字节 ...

  2. 树莓派4B的CPU系统里查到为BCM2835而非BCM2711

    树莓派4B采用四核64位的ARM Cortex-A72架构CPU,型号为博通BCM2711 SoC.2711是个64位的四核,而2835是多年前的32位单核CPU. 查看当前芯片版本,显示为4核心,但 ...

  3. C#LeetCode刷题之#705-设计哈希集合​​​​​​​(Design HashSet)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4114 访问. 不使用任何内建的哈希表库设计一个哈希集合 具体地说 ...

  4. JavaScript apply使用

    call 和 apply 作用: 都是为了改变某个函数运行的context上下文而存在的,为了改变函数体内部 this的指向 JavaScript函数存在定义时上下文和运行时上下文, 上下文(cont ...

  5. Linux expect用法介绍

    1.expect是linux中一个交互命令,一般在 /usr/bin/expect路径下,如果该路径未加入到环境中需要先添加,其作用场景常用于交互执行输入指令 常用命令: expect 获取上一命令执 ...

  6. Golang并发编程基础

    硬件 内存 作为并发编程一个基础硬件知识储备,首先要说的就是内存了,总的来说在绝大多数情况下把内存的并发增删改查模型搞清楚了其他的基本上也是异曲同工之妙. 内存芯片--即我们所知道的内存颗粒,是一堆M ...

  7. TypeScript是什么,为什么要使用它?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://medium.com/swlh/what-is-typescript-bf333e ...

  8. RSA非对称加密(java实例代码)

    使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法String getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使 ...

  9. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  10. openvswitch 流表测试 ovs-appctl

    [root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...