我有一个在 localhost:3000 上运行的 React 前端应用程序,以及在 127.0.0.1:8000 上运行的 Django 后端服务器
我正在使用 fetch() 从函数发送请求 同时使用 widthCredentials 和 Access-Control-Allow-Credentials 可能有点矫枉过正,但我现在正在尝试任何事情。
const response = await fetch(url, {
method: 'POST',
mode: 'cors',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Credentials': 'true',
'withCredentials': 'true',
},
body: JSON.stringify(data)
})
在我的 Django 后端中,我已经安装了 django-cors-headers 并正确设置了所有设置。
Djang 没有抱怨任何请求,所以我相信我的 Django 设置是正确的。 由于某种原因,每个请求中的 sessionId cookie 都是不同的,因此我无法使用它来跟踪跨请求的会话。相反,Django 会为每个请求创建一个新会话。
Django 设置
INSTALLED_APPS = [
....
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
"cache-control",
"pragma",
"access-control-allow-credentials",
"withCredentials",
]
# use file to store sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = "localhost"
SESSION_COOKIE_SECURE = True # if this is to TRUE cookies dont work propoerly, not sure why
# SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_SAMESITE = 'None'
您的问题可能是由于
SESSION_COOKIE_DOMAIN
和 SESSION_COOKIE_PATH
设置不正确造成的。以下是解决此问题的几个步骤:
SESSION_COOKIE_DOMAIN:
None
。将其设置为 "localhost"
通常是不正确的,因为为 "localhost"
设置的 cookie 可能不会被浏览器接受。SESSION_COOKIE_PATH:
"/"
,除非您的 Web 应用程序托管在特定路径上。其他设置:
'django.contrib.sessions'
在您的 INSTALLED_APPS
中并且 'django.contrib.sessions.middleware.SessionMiddleware'
在您的 MIDDLEWARE
中。这是 Django 设置的修改后的配置:
INSTALLED_APPS = [
....
'corsheaders',
'django.contrib.sessions',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
...
]
CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
"cache-control",
"pragma",
"access-control-allow-credentials",
"withCredentials",
]
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = None # For local development
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_SECURE = False # Should be False for local development
SESSION_COOKIE_SAMESITE = 'None'