我正在使用Axios向客户端发送请求到我的Express.js服务器。
我在客户端上设置了一个cookie,我希望从所有Axios请求中读取该cookie,而无需手动添加它们以手动请求。
这是我的客户请求示例:
axios.get(`some api url`).then(response => ...
我尝试在Express.js服务器中使用这些属性来访问标头或Cookie:
req.headers
req.cookies
它们都不包含任何cookie。我正在使用cookie解析器中间件:
app.use(cookieParser())
如何让Axios自动在请求中发送cookie?
编辑:
我在客户端设置cookie如下:
import cookieClient from 'react-cookie'
...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
axios.get('path/to/my/cookie/api').then(response => {
if(response.status == 200){
cookieClient.save('cookie-name', response.data, {path:'/'})
}
})
}
...
虽然它也使用Axios,但它与问题无关。一旦设置了cookie,我只想在我的所有请求中嵌入cookie。
答案 0 :(得分:145)
我遇到了同样的问题并通过withCredential属性修复了它。
来自其他域的XMLHttpRequest无法为自己的域设置cookie值,除非在提出请求之前将ofCredentials设置为true。
<a href="#" class="toggle-nav"><p>toggle</p></a>
答案 1 :(得分:9)
我不熟悉Axios,但据我所知,在javascript和ajax中有一个选项
withCredentials: true
这会自动将cookie发送到客户端。例如,这个场景也是使用passportjs生成的,后者在服务器上设置了一个cookie
答案 2 :(得分:6)
在快速响应中设置必要的标头也很重要。这些是为我工作的:
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', yourExactHostname);
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
答案 3 :(得分:4)
另一种解决方案是使用此库:
https://github.com/3846masa/axios-cookiejar-support
将“Tough Cookie”支持集成到Axios中。请注意,此方法仍需要withCredentials
标记。
答案 4 :(得分:4)
从axios文档中
withCredentials:假,//默认
withCredentials
指示是否应使用凭据发出跨站点访问控制请求
如果您通过{ withCredentials: true }
并通过了请求,那么它应该可以正常工作。
一种更好的方法是将withCredentials
中的true
设置为axios.defaults
axios.defaults.withCredentials = true
答案 5 :(得分:4)
所以我遇到了同样的问题,并且失去了大约6个小时的搜索生命,
text-align: center;
但是,直到出于某种奇怪的原因,浏览器仍然没有保存cookie,我才改变了配置设置:
withCredentials: true
似乎您应该始终先发送“ withCredentials”密钥。
答案 6 :(得分:3)
您可以使用withCredentials
属性在请求中传递Cookie。
axios.get(`api_url`, { withCredentials: true })
通过设置{ withCredentials: true }
,您可能会遇到跨源问题。为了解决这个问题
您需要使用
expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));
在这里您可以阅读有关withCredentials
的信息答案 7 :(得分:1)
你让两个想法好坏参与。
你有&#34; react-cookie&#34;和&#34; axios&#34;
react-cookie =&gt;用于处理客户端的cookie
axios =&gt;用于向服务器发送ajax请求
有了这些信息,如果您希望客户端的cookie也在后端进行通信,您需要将它们连接在一起。
来自&#34; react-cookie&#34;自述:
同构饼干!
为了能够在进行服务器渲染时访问用户cookie,您 可以使用plugToRequest或setRawCookie。
如果这是你需要的,那很好。
如果没有,请发表评论,以便我详细说明。
答案 8 :(得分:0)
如何使Axios自动在请求中发送cookie?
设置axios.defaults.withCredentials = true;
或对于某些特定请求,您可以使用axios.get(url,{withCredentials:true})
如果您的“ Access-Control-Allow-Origin”设置为 通配符(*)。 因此,请务必指定您请求的来源网址
例如:如果发出请求的前端在localhost:3000上运行,则将响应标头设置为
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
也设置
res.setHeader('Access-Control-Allow-Credentials',true);
答案 9 :(得分:0)
对于仍然无法解决问题的人,此答案对我有所帮助。 stackoverflow answer: 34558264
TLDR;
一个人需要在axios和fetch的GET请求和POST请求(获取cookie)中都设置typedef struct Node {
char* nameOfTheFile;
struct Node* firstChild;
struct Node* nextSibling;
struct Node* parent;
int isFile;
} NODE;
NODE* root;
NODE* currentLocation;
char* prepend(char* path, const char* toAdd, int lastWordBeforeRoot)
{
char *newPath = (char*)malloc(strlen(path) + 3 + strlen(toAdd));
strcat(newPath, path);
if(!lastWordBeforeRoot && strcmp(toAdd, "/") != 0){
strcat(newPath,"/");
}
strcat(newPath,toAdd);
free(path);
strcat(newPath, "\0");
return newPath;
}
void pwd() {
NODE* currentFolder = currentLocation;
char* path = (char*)malloc(sizeof(char));
while (currentFolder != NULL) {
if (currentFolder->parent != NULL && strcmp(currentFolder->parent->nameOfTheFile, "/") == 0)
{
path = prepend(path, currentFolder->nameOfTheFile, 1);
}
else
{
path = prepend(path, currentFolder->nameOfTheFile, 0);
}
currentFolder = currentFolder->parent;
}
printf("%s \n", path);
}
。
答案 10 :(得分:0)
对我有用的东西
客户端:
import axios from 'axios';
const url = 'http://127.0.0.1:5000/api/v1';
export default {
login(credentials) {
return axios
.post(`${url}/users/login/`, credentials, {
withCredentials: true,
credentials: 'include',
})
.then((response) => response.data);
},
};
服务器端:
const express = require('express');
const cors = require('cors');
const app = express();
const port = process.env.PORT || 5000;
app.use(
cors({
origin: [`http://localhost:${port}`, `https://localhost:${port}`],
credentials: 'true',
})
);
答案 11 :(得分:0)
对于这些解决方案都不起作用的任何人,请确保您的请求来源等于您的请求目标,请参阅this github issue。
简而言之,如果您在127.0.0.1:8000上访问您的网站,请确保发送的请求以127.0.0.1:8001而非localhost:8001为目标服务器,尽管理论上它可能是同一目标
答案 12 :(得分:0)
这对我有用:
见下面的代码:
const ax = axios.create({
baseURL: 'yourbaseUrl',
withCredentials: true,
});
const loginUser = () => { const body ={username:state.values.email, password:state.values.password};
ax.post('/login',body).then(function(response){
return response}).then().catch(error => console.log(error));}
来源: https://www.npmjs.com/package/axios#creating-an-instance