Dasar CORS: Respons kepada permintaan prapenerbangan gagal semakan kawalan akses: Tiada 'Access-Control-Allow-Origin'

王林
Lepaskan: 2024-02-06 11:00:08
ke hadapan
750 orang telah melayarinya

CORS 策略:对预检请求的响应未通过访问控制检查:无“Access-Control-Allow-Origin”

Kandungan soalan

Saya menggunakan rangka kerja web golang dan gin-gonic/gin di bahagian belakang dan bertindak balas axios di bahagian hadapan. Saya telah cuba menyelesaikannya selama dua hari dan saya masih mendapat ralat yang sama di bawah:

cors policy: response to preflight request doesn't pass access control check: no 'access-control-allow-origin' header is present on the requested resource.
Salin selepas log masuk

Ralat ini hanya berlaku apabila saya cuba menghantar permintaan tampalan, jadi permintaan itu memerlukan permintaan pilihan prapenerbangan, tetapi segala-galanya dengan dapatkan dan pos berfungsi seperti yang diharapkan, mereka tidak menjalankan sebarang semakan prapenerbangan.

Ini ialah kod untuk konfigurasi penghala saya:

package main

import (
    "book_renting/api"
    "log"
    "net/http"

    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/cookie"
    "github.com/gin-gonic/contrib/cors"
    "github.com/gin-gonic/gin"
    _ "github.com/lib/pq"
)

func main() {

    router := gin.default()
    store := cookie.newstore([]byte("your-secret-key"))
    store.options(sessions.options{maxage: 60 * 60 * 24})

    router.use(cors.default())
    router.use(sessions.sessions("sessions", store))

    router.use(func(c *gin.context) {
        host := c.request.header.get("origin")
        c.writer.header().set("access-control-allow-origin", host)
        c.writer.header().set("access-control-allow-credentials", "true")
        c.writer.header().set("access-control-allow-headers", "content-type, authorization")
        c.writer.header().set("access-control-allow-methods", "get, post, put, delete, patch, options")
        if c.request.method == "options" {
            log.println("handling options request")
            c.abortwithstatus(http.statusnocontent)
            return
        }
        log.println("executing cors middleware")
        c.next()
    })

    router.post("/login", api.handlelogin)
    router.get("/logout", api.handlelogout)
    router.post("/register", api.handleregister)
    router.get("/getcookie", api.getcookiesession)

    router.get("/books", api.getbooksapi)
    router.get("/books/:id", api.bookbyidapi)
    router.patch("/rent/:id", api.rentbookapi)
    router.patch("/return/:id", api.returnbookapi)
    router.run("localhost:3000")
}
Salin selepas log masuk

Ini bahagian hadapan:

import axios from 'axios'

const url = 'http://localhost:3000'

export const loginuser = async (credentials) => await axios.post(`${url}/login`, credentials, {withcredentials: true})
export const logoutuser = async () => await axios.get(`${url}/logout`, {withcredentials: true})
export const registeruser = () => axios.post(`${url}/register`)
export const fetchbooks = () => axios.get(`${url}/books`, { withcredentials: true })
export const fetchbookbyid = (book_id) => axios.get(`${url}/books/${book_id}`, { withcredentials: true })
export const rentbook = (book_id) => axios.patch(`${url}/rent/${book_id}`, { withcredentials: true })
export const returnbook = (book_id) => axios.patch(`${url}/return/${book_id}`, { withcredentials: true })
Salin selepas log masuk

Saya agak pasti saya telah menyediakan bahagian belakang dengan betul dan ia sepatutnya mengembalikan semua pengepala yang diperlukan.

Sebagai contoh, untuk permintaan dapatkan, pengepala respons kelihatan seperti ini:

http/1.1 200 ok
access-control-allow-credentials: true
access-control-allow-headers: content-type, authorization
access-control-allow-methods: get, post, put, delete, patch, options
access-control-allow-origin: http://localhost:3001
content-type: application/json; charset=utf-8
date: sat, 10 jun 2023 22:12:11 gmt
content-length: 495
Salin selepas log masuk

Walaupun untuk percubaan permintaan tampalan saya tidak mendapat respons (tidak menghairankan) dan pengepala respons sebelum penerbangan ialah:

http/1.1 200 ok
date: sat, 10 jun 2023 22:12:12 gmt
content-length: 0
Salin selepas log masuk

Adakah anda mempunyai sebarang cadangan untuk masalah yang mungkin berlaku? Selepas dua hari ini saya tidak tahu. Terima kasih terlebih dahulu!

Saya juga cuba menambah tajuk:

c.writer.header().set("access-control-allow-origin", host)
        c.writer.header().set("access-control-allow-credentials", "true")
        c.writer.header().set("access-control-allow-headers", "content-type, authorization")
        c.writer.header().set("access-control-allow-methods", "get, post, put, delete, patch, options")
Salin selepas log masuk

...sekali lagi dalam kenyataan if:

if c.request.method == "options" {
    log.println("handling options request")
    c.abortwithstatus(http.statusnocontent)
    return
    }
Salin selepas log masuk

Tetapi itu tidak membantu sama sekali. Sebenarnya, jika pernyataan ini tidak dilaksanakan apabila preflight dilaksanakan, saya tahu dari konsol bahawa pelayan sedang melaksanakan permintaan pilihan.

[gin] 2023/06/11 - 00:12:13 | 200 |       7.708µs |       127.0.0.1 | options  "/rent/2"
Salin selepas log masuk

Editor:

Ini ialah arahan curl yang menghantar permintaan tampalan (jadi sebenarnya ini adalah permintaan pilihan prapenerbangan):

curl 'http://localhost:3000/return/2' \
  -x 'options' \
  -h 'accept: */*' \
  -h 'accept-language: en-us,en;q=0.9,pl-pl;q=0.8,pl;q=0.7' \
  -h 'access-control-request-headers: content-type' \
  -h 'access-control-request-method: patch' \
  -h 'cache-control: no-cache' \
  -h 'connection: keep-alive' \
  -h 'origin: http://localhost:3001' \
  -h 'pragma: no-cache' \
  -h 'referer: http://localhost:3001/' \
  -h 'sec-fetch-dest: empty' \
  -h 'sec-fetch-mode: cors' \
  -h 'sec-fetch-site: same-site' \
  -h 'user-agent: mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/537.36 (khtml, like gecko) chrome/114.0.0.0 safari/537.36' \
  --compressed
Salin selepas log masuk

Jawapan kepada permintaan ini:

HTTP/1.1 200 OK
Date: Sun, 11 Jun 2023 01:22:57 GMT
Content-Length: 0
Salin selepas log masuk


Jawapan betul


Ternyata anda menggunakan konfigurasi demo bagi pakej yang tidak digunakan github.com/gin-gonic/contrib/cors。您应该使用 github.com/gin-contrib/cors 代替。这是使用 github.com/gin-contrib/cors:

package main

import (
    "github.com/gin-contrib/cors"
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/cookie"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.default()

    config := cors.defaultconfig()
    config.addallowheaders("authorization")
    config.allowcredentials = true
    config.allowallorigins = false
    // i think you should whitelist a limited origins instead:
    //  config.allowallorigins = []{"xxxx", "xxxx"}
    config.alloworiginfunc = func(origin string) bool {
        return true
    }
    router.use(cors.new(config))

    store := cookie.newstore([]byte("your-secret-key"))
    store.options(sessions.options{maxage: 60 * 60 * 24})
    router.use(sessions.sessions("sessions", store))

    // routes below

    router.run("localhost:3000")
}
Salin selepas log masuk

Atas sebab tertentu, patch 请求标头缺少“cookie”标头,尽管我使用了 withcredentials parameter.

axios.patch(`${url}/rent/${book_id}`, { withcredentials: true })
Salin selepas log masuk

Di sini { withcredentials: true } dianggap sebagai data dan tidak mempunyai konfigurasi. Jika anda tiada data untuk dihantar ke pelayan, anda harus menulis seperti ini:

axios.patch(`${url}/rent/${book_id}`, null, { withCredentials: true })
Salin selepas log masuk

Atas ialah kandungan terperinci Dasar CORS: Respons kepada permintaan prapenerbangan gagal semakan kawalan akses: Tiada 'Access-Control-Allow-Origin'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!