Rumah hujung hadapan web tutorial js 通过Koa2框架利用CORS实现跨域ajax请求的方法

通过Koa2框架利用CORS实现跨域ajax请求的方法

Jun 01, 2018 am 11:17 AM
cors koa2 guna

这篇文章主要介绍了浅谈Koa2框架利用CORS完成跨域ajax请求,现在分享给大家,也给大家做个参考。

实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。

本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明(深层次的配置我也不会)。

CORS将请求分为简单请求和非简单请求,可以简单的认为,简单请求就是没有加上额外请求头部的get和post请求,并且如果是post请求,请求格式不能是application/json(因为我对这一块理解不深如果错误希望能有人指出错误并提出修改意见)。而其余的,put、post请求,Content-Type为application/json的请求,以及带有自定义的请求头部的请求,就为非简单请求。

简单请求的配置十分简单,如果只是完成响应就达到目的的话,仅需配置响应头部的Access-Control-Allow-Origin即可。

如果我们在http://localhost:3000 域名下想要访问 http://127.0.0.1:3001 域名。可以做如下配置:

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 await next();
});
Salin selepas log masuk

然后用ajax发起一个简单请求,例如post请求,就可以轻松的得到服务器正确响应了。

实验代码如下:

$.ajax({
  type: 'post',
  url: 'http://127.0.0.1:3001/async-post'
 }).done(data => {
  console.log(data);
})
Salin selepas log masuk

服务器端代码:

router.post('/async-post',async ctx => {
 ctx.body = {
 code: "1",
 msg: "succ"
 }
});
Salin selepas log masuk

然后就能得到正确的响应信息了。

这时候如果看一下请求和响应的头部信息,会发现请求头部多了个origin(还有一个referer为发出请求的url地址),而响应头部多了个Access-Control-Allow-Origin。

现在可以发送简单请求了,但是要想发送非简单请求还是需要其他的配置。

当第一次发出非简单请求的时候,实际上会发出两个请求,第一次发出的是preflight request,这个请求的请求方法是OPTIONS,这个请求是否通过决定了这一个种类的非简单请求是否能成功得到响应。

为了能在服务器匹配到这个OPTIONS类型的请求,因此需要自己做一个中间件来进行匹配,并给出响应使得这个预检能够通过。

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
 ctx.body = '';
 }
 await next();
});
Salin selepas log masuk

这样OPTIONS请求就能够通过了。

如果检查一下preflight request的请求头部,会发现多了两个请求头。

Access-Control-Request-Method: PUT
Origin: http://localhost:3000
Salin selepas log masuk

要通过这两个头部信息与服务器进行协商,看是否符合服务器应答条件。

很容易理解,既然请求头多了两个信息,响应头自然也应该有两个信息相对应,这两个信息如下:

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Salin selepas log masuk
Salin selepas log masuk

第一条信息和origin相同因此通过。第二条信息对应Access-Controll-Request-Method,如果在请求的方式包含在服务器允许的响应方式之中,因此这条也通过。两个约束条件都满足了,所以可以成功的发起请求。

至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

真正的请求当然也成功获得了响应,并且响应头如下(省略不重要部分)

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Salin selepas log masuk
Salin selepas log masuk

请求头如下:

Origin: http://localhost:3000
Salin selepas log masuk

这就很显而易见了,响应头部信息是我们在服务器设定的,因此是这样。

而客户端因为刚才已经预检过了,所以不需要再发Access-Control-Request-Method这个请求头了。

这个例子的代码如下:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put'
  }).done(data => {
   console.log(data);
});
Salin selepas log masuk

服务器代码:

app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  await next();
});
Salin selepas log masuk

至此我们完成了能够正确进行跨域ajax响应的基本配置,还有一些可以进一步配置的东西。

比如,到目前为止,每一次非简单请求都会实际上发出两次请求,一次预检一次真正请求,这就比较损失性能了。为了能不发预检请求,可以对如下响应头进行配置。

Access-Control-Max-Age: 86400
Salin selepas log masuk

这个响应头的意义在于,设置一个相对时间,在该非简单请求在服务器端通过检验的那一刻起,当流逝的时间的毫秒数不足Access-Control-Max-Age时,就不需要再进行预检,可以直接发送一次请求。

当然,简单请求时没有预检的,因此这条代码对简单请求没有意义。

目前代码如下:

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
 ctx.set('Access-Control-Max-Age', 3600 * 24);
 await next();
});
Salin selepas log masuk

到现在为止,可以对跨域ajax请求进行响应了,但是该域下的cookie不会被携带在请求头中。如果想要带着cookie到服务器,并且允许服务器对cookie进一步设置,还需要进行进一步的配置。

为了便于后续的检测,我们预先在http://127.0.0.1:3001这个域名下设置两个cookie。注意不要错误把cookie设置成中文(刚才我就设置成了中文,结果报错,半天没找到出错原因)

然后我们要做两步,第一步设置响应头Access-Control-Allow-Credentials为true,然后在客户端设置xhr对象的withCredentials属性为true。

客户端代码如下:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put',
   data: {
    name: '黄天浩',
    age: 20
   },
   xhrFields: {
    withCredentials: true
   }
  }).done(data => {
   console.log(data);
  });
Salin selepas log masuk

服务端如下:

app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Allow-Credentials', true);
  await next();
});
Salin selepas log masuk

这时就可以带着cookie到服务器了,并且服务器也可以对cookie进行改动。但是cookie仍是http://127.0.0.1:3001域名下的cookie,无论怎么操作都在该域名下,无法访问其他域名下的cookie。

现在为止CORS的基本功能已经都提到过了。

一开始我不知道怎么给Access-Control-Allow-Origin,后来经人提醒,发现可以写一个白名单数组,然后每次接到请求时判断origin是否在白名单数组中,然后动态的设置Access-Control-Allow-Origin,代码如下:

app.use(async (ctx, next) => {
 if (ctx.request.header.origin !== ctx.origin && whiteList.includes(ctx.request.header.origin)) {
  ctx.set('Access-Control-Allow-Origin', ctx.request.header.origin);
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Allow-Credentials', true);
  ctx.set('Access-Control-Max-Age', 3600 * 24);
 }
 await next();
});
Salin selepas log masuk

这样就可以不用*通配符也可匹配多个origin了。

注意:ctx.origin与ctx.request.header.origin不同,ctx.origin是本服务器的域名,ctx.request.header.origin是发送请求的请求头部的origin,二者不要混淆。

最后,我们再稍微调整一下自定义的中间件的结构,防止每次请求都返回Access-Control-Allow-Methods以及Access-Control-Max-Age,这两个响应头其实是没有必要每次都返回的,只是第一次有预检的时候返回就可以了。

调整后顺序如下:

app.use(async (ctx, next) => {
 if (ctx.request.header.origin !== ctx.origin && whiteList.includes(ctx.request.header.origin)) {
  ctx.set('Access-Control-Allow-Origin', ctx.request.header.origin);
  ctx.set('Access-Control-Allow-Credentials', true);
 }
 await next();
});

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Max-Age', 3600 * 24);
  ctx.body = '';
 }
 await next();
});
Salin selepas log masuk

这样就减少了多余的响应头。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

webpack打包js的方法

vue 简单自动补全的输入框的示例

angular5 httpclient的示例实战

Atas ialah kandungan terperinci 通过Koa2框架利用CORS实现跨域ajax请求的方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan GitLab untuk pengurusan dokumen projek Cara menggunakan GitLab untuk pengurusan dokumen projek Oct 20, 2023 am 10:40 AM

Cara menggunakan GitLab untuk pengurusan dokumen projek 1. Pengenalan latar belakang Dalam proses pembangunan perisian, dokumen projek adalah maklumat yang sangat penting, mereka bukan sahaja dapat membantu pasukan pembangunan memahami keperluan dan reka bentuk projek, tetapi juga memberikan rujukan kepada pasukan ujian dan pelanggan. Untuk memudahkan kawalan versi dan kerjasama pasukan dokumen projek, kami boleh menggunakan GitLab untuk pengurusan dokumen projek. GitLab ialah sistem kawalan versi berdasarkan Git Selain menyokong pengurusan kod, ia juga boleh mengurus dokumen projek. 2. Persediaan persekitaran GitLab Pertama, I

Cara menggunakan Flask-CORS untuk mencapai perkongsian sumber merentas domain Cara menggunakan Flask-CORS untuk mencapai perkongsian sumber merentas domain Aug 02, 2023 pm 02:03 PM

Cara menggunakan Flask-CORS untuk mencapai perkongsian sumber merentas domain Pengenalan: Dalam pembangunan aplikasi rangkaian, perkongsian sumber merentas domain (CrossOriginResourceSharing, dirujuk sebagai CORS) ialah mekanisme yang membolehkan pelayan berkongsi sumber dengan sumber atau nama domain yang ditentukan. Menggunakan CORS, kami boleh mengawal penghantaran data secara fleksibel antara domain yang berbeza dan mencapai akses merentas domain yang selamat dan boleh dipercayai. Dalam artikel ini, kami akan memperkenalkan cara menggunakan perpustakaan sambungan Flask-CORS untuk melaksanakan fungsi CORS.

Bagaimana untuk menggunakan permintaan merentas domain CORS dalam rangka kerja PHP-Slim? Bagaimana untuk menggunakan permintaan merentas domain CORS dalam rangka kerja PHP-Slim? Jun 03, 2023 am 08:10 AM

Dalam pembangunan web, permintaan merentas domain adalah masalah biasa. Ini kerana penyemak imbas mempunyai sekatan ketat terhadap permintaan antara nama domain yang berbeza. Contohnya, kod bahagian hadapan tapak web A tidak boleh menghantar permintaan terus ke API tapak web B melainkan tapak web B membenarkan permintaan merentas domain. Untuk menyelesaikan masalah ini, teknologi CORS (Cross-Origin Resource Sharing) muncul. Artikel ini akan memperkenalkan cara menggunakan permintaan merentas domain CORS dalam rangka kerja PHP-Slim. 1. Apakah itu CORSCORS? Ia adalah mekanisme yang menambah beberapa jumlah pada pengepala HTTP yang sepadan.

Apakah maksud video yang disyorkan TikTok? Bagaimana untuk menggunakan Douyin untuk mengesyorkan video? Apakah maksud video yang disyorkan TikTok? Bagaimana untuk menggunakan Douyin untuk mengesyorkan video? Mar 27, 2024 pm 03:01 PM

Sebagai platform sosial video pendek yang terkenal di dunia, Douyin telah memenangi hati sebilangan besar pengguna dengan algoritma pengesyoran peribadi yang unik. Artikel ini akan menyelidiki nilai dan prinsip pengesyoran video Douyin untuk membantu pembaca memahami dengan lebih baik dan menggunakan sepenuhnya ciri ini. 1. Apakah video yang disyorkan oleh Douyin? Platform Douyin menganalisis sejarah tontonan pengguna, gelagat suka dan komen, berkongsi rekod dan data lain untuk memilih dan mengesyorkan video yang paling sesuai dengan citarasa pengguna daripada perpustakaan video yang besar. Sistem pengesyoran diperibadikan ini bukan sahaja menambah baik pengalaman pengguna, tetapi juga membantu pengguna menemui lebih banyak kandungan video yang sepadan dengan pilihan mereka, sekali gus meningkatkan kelekatan dan kadar pengekalan pengguna. di sini

Bagaimana untuk membina API RESTful dan melaksanakan CORS menggunakan Golang? Bagaimana untuk membina API RESTful dan melaksanakan CORS menggunakan Golang? Jun 02, 2024 pm 05:52 PM

Cipta API RESTful dan laksanakan CORS: Cipta projek dan pasang kebergantungan. Sediakan penghalaan HTTP untuk mengendalikan permintaan. Dayakan perkongsian sumber silang asal (CORS) menggunakan middlewareCORS middleware. Gunakan perisian tengah CORS pada penghala untuk membenarkan permintaan GET dan OPTIONS daripada mana-mana domain.

Gunakan CORS dalam rangka kerja Beego untuk menyelesaikan masalah merentas domain Gunakan CORS dalam rangka kerja Beego untuk menyelesaikan masalah merentas domain Jun 04, 2023 pm 07:40 PM

Dengan pembangunan aplikasi web dan globalisasi Internet, semakin banyak aplikasi perlu membuat permintaan merentas domain. Permintaan merentas domain ialah masalah biasa bagi pembangun bahagian hadapan, dan ia boleh menyebabkan aplikasi tidak berfungsi dengan betul. Dalam kes ini, salah satu cara terbaik untuk menyelesaikan masalah permintaan silang asal ialah menggunakan CORS. Dalam artikel ini, kami akan menumpukan pada cara menggunakan CORS dalam rangka kerja Beego untuk menyelesaikan masalah merentas domain. Apakah permintaan merentas domain? Dalam aplikasi web, permintaan merentas domain merujuk kepada permintaan daripada halaman web bagi satu nama domain kepada yang lain

Bagaimana untuk menggunakan bahasa Go untuk pengaturcaraan serentak? Bagaimana untuk menggunakan bahasa Go untuk pengaturcaraan serentak? Jun 10, 2023 am 10:33 AM

Dengan pembangunan berterusan perkakasan komputer, teras CPU dalam pemproses tidak lagi meningkatkan kekerapan jam secara individu, tetapi meningkatkan bilangan teras. Ini menimbulkan persoalan yang jelas: Bagaimana untuk memanfaatkan sepenuhnya teras ini? Satu penyelesaian adalah melalui pengaturcaraan selari, yang melibatkan pelaksanaan pelbagai tugas serentak untuk menggunakan sepenuhnya teras CPU. Ini adalah ciri unik bahasa Go Ia adalah bahasa yang direka khusus untuk pengaturcaraan serentak. Dalam artikel ini, kami akan meneroka cara memanfaatkan bahasa Go untuk pengaturcaraan serentak. Coroutines Pertama, kita perlu faham

Apakah cara springboot menyelesaikan isu merentas domain CORS? Apakah cara springboot menyelesaikan isu merentas domain CORS? May 13, 2023 pm 04:55 PM

1. Laksanakan antara muka WebMvcConfigurer @ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{/***Tambah sokongan merentas domain*/@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){//Laluan yang membenarkan akses merentas domain '/**' mewakili semua kaedah pendaftaran aplikasi.addMapping ("/** ")//Sumber yang membenarkan akses merentas domain'*

See all articles