我正在使用Axios从客户端向Express.js服务器发送请求.
我在客户端设置了一个cookie,我想从所有Axios请求中读取该cookie,而不是手动添加它们来手动请求.
这是我的客户端请求示例:
axios.get(`some api url`).then(response => ...
Run Code Online (Sandbox Code Playgroud)
我试图通过在Express.js服务器中使用这些属性来访问标头或cookie:
req.headers
req.cookies
Run Code Online (Sandbox Code Playgroud)
它们都不包含任何cookie.我正在使用cookie解析器中间件:
app.use(cookieParser())
Run Code Online (Sandbox Code Playgroud)
如何让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:'/'})
}
})
}
...
Run Code Online (Sandbox Code Playgroud)
虽然它也使用Axios,但它与问题无关.一旦设置了cookie,我只想在我的所有请求中嵌入cookie.
我现在正遇到一个奇怪的CORS问题.
这是错误消息:
XMLHttpRequest cannot load http://localhost:8666/routeREST/select?q=[...]
Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin
Run Code Online (Sandbox Code Playgroud)
两台服务器:
有什么想法可能是什么问题?
编辑:
而且...端口是问题所在.谢谢你的回答:)
如果有人也使用Python瓶服务器,你可以按照这篇文章给出的答案来解决CORS问题: Bottle Py:为jQuery AJAX请求启用CORS
我在Firefox和Chrome中使用window.fetch().出于某些原因,fetch()不会发送任何cookie.现在这不会成为问题,因为我可以使用它们发送它们
fetch('/something', { headers: { Cookie: document.cookie } })
Run Code Online (Sandbox Code Playgroud)
但这不适用于httpOnly cookie.
我的请求有问题fetch。由于某些原因,当我向服务器发出请求时,它不会发送我的 cookie。例如,我正在使用这样的获取请求
fetch('/api/islogged', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Cache': 'no-cache'
},
credentials: 'include',
})
Run Code Online (Sandbox Code Playgroud)
即使我已经登录,它仍然说我没有登录。www.localhost.com/api/islogged但是,如果我直接在浏览器中访问,它会返回正确的答案
我正在尝试使用JavaScript的fetch库来向我的Django应用程序提交表单.但无论我做什么,它仍然抱怨CSRF验证.
关于Ajax的文档提到了指定我尝试过的头文件.
我还尝试从templatetag中获取令牌并将其添加到表单数据中.
这两种方法似乎都不起作用.
以下是包含表单值和标题的基本代码:
let data = new FormData();
data.append('file', file);;
data.append('fileName', file.name);
// add form input from hidden input elsewhere on the page
data.append('csrfmiddlewaretoken', $('#csrf-helper input[name="csrfmiddlewaretoken"]').attr('value'));
let headers = new Headers();
// add header from cookie
const csrftoken = Cookies.get('csrftoken');
headers.append('X-CSRFToken', csrftoken);
fetch("/upload/", {
method: 'POST',
body: data,
headers: headers,
})
Run Code Online (Sandbox Code Playgroud)
我能够使用JQuery,但想尝试使用fetch.
我正在尝试使用 Django Rest Framework 构建单页应用程序。对于身份验证,我使用登录视图来启动会话并要求对所有 api 路由进行 csrf 保护。由于没有进行模板化,因此csrf_token从未使用该标记,因此我必须使用 手动获取令牌get_token。我不想将其放在主视图中给出的主索引文件中,而是想将其设置在自己的 cookie 上。不,这不是 django 提供的 CSRF Cookie,因为它具有 CSRF 秘密,而且我提到我正在使用会话,因此秘密存储在那里。该 cookie 将具有将用于所有变异请求的令牌。
我已经尝试了一切让 django 接受 cookie 但没有任何效果。我第一次可以正常登录,因为没有之前的会话,但此后的任何操作都会抛出错误 403。我尝试使用,ensure_csrf_cookie但没有帮助。我尝试不进行会话,但仍然一无所获。我什至尝试重新排列中间件顺序,但仍然一无所获。我什至尝试了自己的自定义中间件来创建 cookie,但它不起作用。这是我现在得到的代码:
视图.py
@api_view(http_method_names = ["GET"])
def home(request):
"""API route for retrieving the main page of web application"""
return Response(None, status = status.HTTP_204_NO_CONTENT);
class LoginView(APIView):
"""API endpoint that allows users to login"""
def post(self, request, format = None):
"""API login handler"""
user = authenticate(username = request.data["username"], password = request.data['password']); …Run Code Online (Sandbox Code Playgroud) 我知道 HttpOnly 意味着您无法使用 JS 访问它。我在想,也许你看不懂,但你可以寄回去吗?我不知道。
对于同一台服务器的新请求,我想发回那个 cookie。这可以使用 ReactJS 吗?或者也许有一些方法可以绕过它,比如用简单的 HTML 而不是 ReactDOM 打开新窗口?
谢谢你的帮助。