请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

浏览器没有保存cookie-session

环境:

Django==2.2.19,uwsgi,Nginx,vue,Goole 90.x centos7, 内网

问题描述:

本地运行时和vue联调,登录可以,访问个人中心也可以,所有接口访问都是ok的,后端能获取到用户的登录信息。
当我把程序并部署到服务器上时,可以登录,但是所有接口都无法访问,因为后端获取不到 用户的登录信息,所有请求都被跳转到登录页面;

相关代码

:验证登录代码

def login_required_json(view_func):
    """
    判断用户是否登录的装饰器,并返回json
    :param view_func: 被装饰的视图函数
    :return: json、view_func
    """

    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        # 如果用户未登录,返回json数据
        if request.user.is_authenticated is False:
            logger.error(
                f"这个接口被请求时:{request.path},查到没有登录状态: {usip(request)}----{request.COOKIES.get('sessionid', None)}")
            return JsonResponse({'code': "504", 'msg': '用户未登录'})
        else:
            # 如果用户登录,进入到view_func中
            return view_func(request, *args, **kwargs)

    return wrapper


class LoginRequiredMixin(object):
    """验证用户是否登陆并返回json的扩展类"""

    @classmethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        return login_required_json(view)
    # pass

settings-session-cookie的设置:

# SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = None
SESSION_COOKIE_HTTPONLY = None  # 是否HttpOnly在会话 cookie 上使用标志 如果设置为 True,客户端 JavaScript 将无法访问会话 cookie。
# SESSION_COOKIE_DOMAIN = "zhiliao.com"
SESSION_ENGINE = "django.contrib.sessions.backends.cache"  # 用于会话 cookie 的域
# SESSION_CACHE_ALIAS = "session"
SESSION_COOKIE_AGE = 60 * 60  # 以秒为单位
SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)

Nginx 代理 部分配置:

    server {
        listen       80;
        server_name  api.cicada.com;
        location / {       
            include             uwsgi_params;
            uwsgi_pass          127.0.0.1:8101;
        }
    }

    server {
        listen       80;
        server_name  admin.cicada.com;
        location / {
            root   /home/cicada/admin;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

这是部署在服务器的 cookie中没有保存sessionid
图片描述

这个是个本地运行的;cookie中就有sessionid
图片描述

求解

导致这种问题的原因是不是跨域?如果是怎么优化?
导致这种问题的原因是不是Nginx代理问题,前端url 与后端 url 不同导致的?如果是 有没有具体的配置方案或者代码demo?

案例

https://blog.csdn.net/weixin_42681866/article/details/104786293
这个博客案例与我的很相似,但是解决不了。

正在回答

1回答

课程是前后端分离的,保存token到cookie中是由前端自己写入的,所以你需要通过f12看看运行的时候是否登陆的接口返回了token,如果返回了没有写入到cookie中那么你需要看看console中是否有报错

0 回复 有任何疑惑可以回复我~
  • 提问者 天才在左_我在右 #1
    对于前后端分离的项目,是不是必须用token?session不用的原因是啥?请达指点!!
    回复 有任何疑惑可以回复我~ 2021-06-11 13:38:23
  • 提问者 天才在左_我在右 #2
    对于前后端分离的项目,是不是必须用token?session不用的原因是啥?请达指点!!
    回复 有任何疑惑可以回复我~ 2021-06-11 13:40:09
  • bobby 回复 提问者 天才在左_我在右 #3
    前后端分离一般都是由后端给一个token给前端,前端自己去保存,后端不管前端会如何处理,不然怎么会叫前后端分离。session机制和token机制也不是非此即彼的关系,session的最大特点就是后端要保存登陆的状态,但是jwt不用管,我们这里说到的应该是:将token放入到浏览器的cookie中应该是前端来完成还是后端来完成,课程中是由前端来完成,所以后端只要返回了token给前端,至于前端的登陆状态是不是没有变那就是不关后端的事了
    回复 有任何疑惑可以回复我~ 2021-06-11 13:51:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信