superstarxue630 2024-02-19 16:51 采纳率: 63.6%
浏览 2

php+ajax前后端跨域session失效问题

前端Ajax,后端PHP

前端两个按钮
$("#sub").click(function(){
        $.ajax({
            type: "post",
            url:"http://a.cn:81/index.php?act=1",  
            xhrFields: { 
                withCredentials: true//允许带上cookies
            },
            crossDomain: true,
            data:$('#loginhttps://img-mid.csdnimg.cn/release/static/image/mid/ask/ed1b90bc5e844b98bb18bd82e76acdd7.png "#left")
Form').serialize(),
            dataType: "json",//将返回数据数组化,否则返回的是字符串
            success: function (result) {
                console.log(result);
            }
        });
    });
    $("#sub2").click(function(){
        $.ajax({
            type: "post",
            url:"http://a.cn:81/index.php?act=2",  
            xhrFields: { 
                withCredentials: true//允许带上cookies
            },
            crossDomain: true,
            data:$('#loginForm').serialize(),
            dataType: "json",//将返回数据数组化,否则返回的是字符串
            success: function (result) {
                console.log(result);
            }
        });
    });
后端得设置header才能接收跨域信息
    header("Access-Control-Allow-Credentials:true");
    header("Access-Control-Allow-Origin:http://127.0.0.1");
    //  设置一个存放目录,必须在 session_start() 函数调用之前调用
    //$savePath = './session_save_dir/';
    //session_save_path($savePath);//会导致获取不到session,后期想想怎么改吧
    //  保存一天,必须在 session_start() 函数调用之前调用
    $lifeTime = 24 * 60 * 60;
    session_set_cookie_params($lifeTime);
    session_start();
    $act = $_REQUEST['act'];
    if($act==1){
        $userName = $_REQUEST['userName'];
        $_SESSION["userName"] = $userName;//权限
        setcookie(session_name(), session_id(), time() + $lifeTime, "/");
        echo out_json(1, $_SESSION,$_COOKIE);exit;
    }else{
        echo out_json(2, $_SESSION,$_COOKIE);exit;
    }
    
    function out_json($code, $msg, $data)
    {
        $json['code'] = $code;
        $json['msg'] = $msg;
        $json['data'] = $data;
        $json = json_encode($json);
        return $json;
    }

img

跨域的cookie获取不到,且再次访问session失效
请问这个要怎么解决

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-19 17:19
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    要解决这个问题,你需要做以下几个调整:

    1. 后端设置:确保后端设置了正确的跨域响应头,并且使用了正确的域名。在你的 PHP 代码中,你已经设置了跨域响应头,但是允许的域名是固定的 http://127.0.0.1,这意味着只有来自该域名的请求才会被接受。如果你的前端代码运行在不同的域名下,确保在 Access-Control-Allow-Origin 中设置正确的域名。

      header("Access-Control-Allow-Origin: http://yourdomain.com"); // 更改为你的前端域名
      header("Access-Control-Allow-Credentials: true");
      
    2. Session 设置:确保你在处理 Session 之前设置了正确的 Session 参数,并且在每次请求中都正确启动了 Session。在你的 PHP 代码中,你已经设置了 Session 的参数,并且在处理逻辑中启动了 Session。但是,要确保在任何输出之前都要先调用 session_start(),以便 PHP 能够正确识别和处理 Session。

      session_set_cookie_params($lifeTime);
      session_start(); // 在处理 Session 之前确保调用 session_start()
      
    3. 前端设置:确保前端代码中的 withCredentials 设置为 true,并且请求的域名与后端设置的域名一致。你的前端代码已经设置了 withCredentials 为 true,但是确保请求的域名与后端设置的域名一致。

      xhrFields: {
          withCredentials: true // 允许带上 cookies
      }
      

    通过以上调整,应该可以解决你遇到的跨域 Session 失效的问题。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月19日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP