javascript - Laravel 使用 Ajax 设置 cookie

标签 javascript jquery ajax cookies laravel-4

我在通过 ajax 在 laravel 中设置 cookie 时遇到了问题。我已经阅读了很多问题/帖子,但都无济于事。

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

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

我的javascript:

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

cookie/set 的 Controller 函数:

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 Controller 函数:

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

再次,我可以确认 get 路由正常工作。我的想法是以某种方式没有从 set ajax 调用的响应中返回 cookie,但我不明白为什么。

在此先感谢您的帮助! -沃利

编辑:

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

编辑 2:

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

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');
}

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

最佳答案

我可以看到您有一个带有获取路由的 js Post 函数。这在 Laravel 中不起作用。

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

关于javascript - Laravel 使用 Ajax 设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23278659/

相关文章:

javascript - 在网站上推进图像 slider 时页面滚动

javascript - 如何在 2 个 JSON 文件之间插入匹配 JSON 键的值

javascript - 使用ajax将Json/Jsonp数据放入表单

c# - 提交 AJAX 请求时的 Controller 方法

javascript - 是否有任何 javascript 库来捕获鼠标/键盘事件并将它们发送到外部服务器?

javascript - 至少包含 1 个数字和 1 个字符且固定长度为 11 的字母数字字符串的正则表达式

javascript - 使用 Channel API 接收来自任务队列中任务的消息

php - 使用ajax传递单选按钮信息

javascript - 如何使用jquery动态创建html

javascript - 将 JSON 响应转换为 map