【问题标题】:Laravel Setting cookies with AjaxLaravel 使用 Ajax 设置 cookie
【发布时间】:2014-06-10 07:32:49
【问题描述】:

我无法通过 ajax 在 laravel 中设置 cookie。我已经阅读了许多问题/帖子无济于事。

我有一个下拉菜单,当更改时,使用 js 将其值发布到控制器,该控制器设置 cookie 并返回带有该 cookie 的响应,然后在 ajax 完成时刷新页面,并在 document.ready 脚本中,它调用一个 get cookie 路由,该路由从该 cookie 中检索值。似乎没有发送cookie?我知道获取路径有效,就好像我在其他地方设置了 cookie,它可以正确检索它。我还使用 headers_sent() 来确保在设置 cookie 并返回响应之前尚未发送标头。我还尝试了许多在其他 SO 问题和答案中看到的不同方法,包括 Cookie::queue、$response->withCookie($cookie) 和 $response->headers->setCookie($cookie), none我发现其中的一个工作。

我的方法有问题吗?还是更可能是语法问题?

我的javascript:

function trans(lang){
    $.post( 'cookie/set' , {'name':'language', 'value':lang, 'timeout':-1})
    .done(function(data){
        removeEvent();
    }).always(function(){
        window.location.reload();
    });
}

cookie/set 的控制器函数:

public function postSet(){
    $name = Input::get('name');
    $value = Input::get('value');
    $timeout = Input::get('timeout');
    if(Request::ajax()){
        Log::info('cookie', array('name'=>$name, 'value'=>$value, 'timeout'=>$timeout));
        $cookie = Cookie::make($name, $value, $timeout);
        $response = Response::make();
        $response->headers->setCookie($cookie);
        return $response->withCookie($cookie);
    }
}

doc.ready javascript:

$(document).ready(function(){
    $.post( 'cookie/get' , {'name':'language'})
    .done(function(data){
        if (!data){
            alert('no cookie');
        }
        $("#language").val(data);
        removeEvent();
    });
})

最后是 cookie/get 控制器函数:

public function postGet(){
    $name = Input::get('name');
    define('__TRANSLATEMODE',"raw");
    return Cookie::get($name);
}

再次,我可以确认 get 路线正常工作。我的想法是不知何故,cookie 没有随 set ajax 调用的响应一起返回,但我不明白为什么。

提前感谢您的帮助! -沃利

编辑:

我查看了 firebug 中的请求和响应,似乎来自 postSet 路由的响应不包含 cookie。我有点怀疑这一点。但至少这确定了问题的根源。仍然不确定为什么它不想工作。

编辑 2:

我解决了。不完全确定为什么会这样,但下面的代码现在可以工作了。似乎返回一个空响应不会发送cookies?不知道,至少解决了。我会在允许的时候回答这个问题,并将其标记为已接受。 (如果有人知道为什么要修复它,将不胜感激 cmets。)

public function postSet(){
    $name = Input::get('name');
    $value = Input::get('value');
    $timeout = Input::get('timeout');
    Cookie::queue($name, $value, $timeout);
    $response = Response::make();
    return Response::make('test');
}

感谢那些看过的人,希望这对其他人有所帮助。 -沃利

【问题讨论】:

    标签: javascript jquery ajax cookies laravel-4


    【解决方案1】:

    我可以看到你有一个带有 Get Route 的 js Post 函数。这在 Laravel 中不起作用。

    不确定这是否是整个问题,但检查路线肯定会帮助您缩小范围。

    【讨论】:

    • 路由是post路由。它的名称是“get”,因此是 postGet() 函数名称。 (我知道,不是最好的命名。)我知道这条路线按预期工作。我认为是 postSet 函数是罪魁祸首。那就是 JS 中的操作顺序,即在响应与 cookie 一起发送之前重新加载页面。等
    • 我想你和这里stackoverflow.com/questions/22903995/…有同样的问题
    • "我还使用 headers_sent() 来确保在设置 cookie 并返回响应之前尚未发送标头。"所以不是同一个问题。
    【解决方案2】:

    我解决了。不完全确定为什么会这样,但下面的代码现在可以工作了。似乎返回一个空响应不会发送cookies?不知道,至少解决了。我会在允许的时候回答这个问题,并将其标记为已接受。 (如果有人知道为什么要修复它,将不胜感激 cmets。)

    public function postSet(){
        $name = Input::get('name');
        $value = Input::get('value');
        $timeout = Input::get('timeout');
        Cookie::queue($name, $value, $timeout);
        $response = Response::make();
        return Response::make('test');
    }
    

    感谢那些看过的人,希望这对其他人有所帮助。 -沃利

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2015-06-07
      • 2012-08-26
      • 2015-08-13
      相关资源
      最近更新 更多