如何从不同来源获取数据并在请求中包含cookie

问题描述 投票:0回答:1

问题是我从后端获取cookie,该后端与前端的来源不同。而且我无法让 cors 与我一起工作。我正在使用带有 elysia 的小圆面包。

这是我为缩小问题范围而制作的示例。

前端将创建两个我想传递给后端的cookie。然后他们会注意到并创建一个新的 cookie 并将其发送到前端。如果来源相同,则此方法有效。因此,如果您转到 localhost 1234 并在开发人员工具中自己创建用户名和密码 cookie,它就可以工作了
正如预期的那样。

我尝试在获取中包含标头“Content-Type”:“application/json”和凭证:“include”。

后端

import Elysia from "elysia";
import cors from "@elysiajs/cors";

const app = new Elysia();

app.use(cors());

app.post("/cookies", ({ cookie: { username, password, icecream } }) => {
    icecream.value = "chocolate";
    console.log(username + ":" + password);
});

app.listen(1234);
console.log("Server up and running at http://localhost:1234");

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="post">
        <input type="text" placeholder="username" name="username">
        <input type="text" placeholder="password" name="password">
        <button>submit</button>
    </form>
    <script>
        document.querySelector("form").addEventListener("submit", (e) => {
            e.preventDefault();
            console.log("submitting");
            document.cookie = `username=${document.querySelector("input[name='username']").value}`;
            document.cookie = `password=${document.querySelector("input[name='password']").value}`;

            fetch("http://localhost:1234/cookies", {
                method: "POST",
                headers: {
                    'Content-Type': 'application/json'
                },
                credentials: "include"
            })
            .then((response) => {
                console.log(response);
            });
        })

        
    </script>
</body>
</html>
javascript cors fetch-api bun elysiajs
1个回答
0
投票

您在尝试从前端向托管在不同来源的后端发出请求时似乎遇到了 CORS 问题。首先,您需要在后端设置 CORS 在后端代码中,确保正确配置 CORS 以允许来自前端源的请求。您已经在使用 @elysiajs/cors 中间件,但需要在 CORS 配置中指定允许的来源。 您可以通过将选项对象传递给 cors() 函数来完成此操作

import Elysia from "elysia";
import cors from "@elysiajs/cors";

const app = new Elysia();

app.use(cors({
    origin: "http://localhost: 1234"
}));

然后确保凭据包含在获取请求中

fetch("http://localhost:1234/cookies", {
    method: "POST",
    headers: {
        'Content-Type': 'application/json'
    },
    credentials: "include"
})
.then((response) => {
    console.log(response);
});

如果您的前端和后端托管在不同的源上,浏览器可能会首先发送预检 OPTIONS 请求以检查服务器是否允许实际请求。确保您的后端使用适当的 CORS 标头正确响应 OPTIONS 请求。

例如,您可以添加一个路由处理程序来响应带有必要 CORS 标头的 OPTIONS 请求

app.options("*", cors());
这将使用适当的 CORS 标头响应所有 OPTIONS 请求,从而允许浏览器继续处理实际请求。

通过这些更改,您的前端应该能够向后端发出请求,而不会遇到 CORS 问题。确保将

http://localhost:YOUR_FRONTEND_PORT
替换为前端应用程序的实际来源

© www.soinside.com 2019 - 2024. All rights reserved.