【问题标题】:Laravel5 AJAX set cookie not workingLaravel5 AJAX 设置 cookie 不起作用
【发布时间】:2016-05-12 22:53:33
【问题描述】:

你能给我建议吗?

我正在 COOKIES 中保存一些数据。我在 Laravel 中为此创建了方法,所以我在这个方法上调用 ajax 来设置 cookie,但是当我尝试调用访问这个 cookie 值的下一个请求时,它没有被保存,我可以在第二个请求中访问它......我不不知道为什么......这很奇怪:/

我有这个代码:

public function setCookie: method in laravel controller to set cookie
var setCookie: function in javascript where I call ajax request to set cookie
var loadEvents: method called after ajax call where I set cookie.


public function setCookie(Request $request) {

    $cookieName = $request->input('cookie_name');
    $cookieVal = $request->input('cookie_val');

    return response()->json(['status' => 'success'])->withCookie(cookie($cookieName, $cookieVal));
}


var setCookie = function (cookieName, cookieVal) {
    $.ajax({
        type: 'POST',
        url: window.setCookieUrl,
        data: {
            cookie_name: cookieName,
            cookie_val: cookieVal,
            _token: getCsrfToken()
        }
    }).done();
};



public function loadEvents(Request $request) {

    $activeCalendarsIds = $request->input('active_calendars_ids');
    if($activeCalendarsIds == null)
        $activeCalendarsIds = Cookie::get('adminActiveCalendars');


    $eventsPage = $this->getPostParam('page');
    $eventsLimit = $this->getPostParam('limit');

    $this->service->setFilter('page', $eventsPage);
    $this->service->setFilter('limit', $eventsLimit);

    $events = $this->service->getCalendarsEvents($activeCalendarsIds);
    $eventList = view('admin/calendar/event_list', ['events' => $events]);

    return response()->json([
        'status' => 'success',
        'data' => '' . $eventList . ''
    ]);

}

【问题讨论】:

  • 你确定设置 cookie 的 AJAX 调用在使用 cookie 的调用之前已经完成了吗?
  • 如果 cookie 设置方法正是你发布的,你可以从 Javascript 设置 cookie
  • 是的,完成了,因为我检查了AJAX调用响应。问题是,在 Laravel5 中使用 JavaScript 设置 cookie 很复杂,因为 laravel 在数据库中设置了 cookie。
  • $activeCalendarsIds = $request->cookie('adminActiveCalendars'); 怎么样
  • 不:/这不起作用。

标签: javascript php ajax cookies laravel-5


【解决方案1】:

更新:以下按预期工作。请求的陈述顺序似乎存在混淆。 setCookie ajax 请求必须在任何 loadEvent ajax 请求发送之前完成。

控制器操作:

public function set(Request $request)
{
    $cookieName = $request->input('cookie_name');
    $cookieVal = $request->input('cookie_val');
    return response()->json(['previousCookieValue' => Cookie::get('adminActiveCalendars')])->withCookie(cookie($cookieName, $cookieVal));
}

public function events() {
    return response()->json([
        'cookieValue' => Cookie::get('adminActiveCalendars'),
    ]);
}

Javascript/jQuery:

var setCookie = function(cookieName, cookieVal) {
  console.log('Set cookie', cookieName, cookieVal);
  $.ajax({
    type: 'POST',
    url: '{{ route('cookies.set') }}',
    data: {
      cookie_name: cookieName,
      cookie_val: cookieVal,
      _token: '{{ csrf_token() }}'
    },
    success: function(response) {
      console.log('Response:', response);
    }
  });
};

var loadEvents = function() {
  console.log('Load events');
  $.ajax({
    type: 'GET',
    url: '{{ route('cookies.events') }}',
    success: function(response) {
      console.log('Response:', response);
    }
  });
};

模板:

<button onclick="loadEvents();" type="button">Load Events</button>
<button onclick="setCookie('adminActiveCalendars', 'Foo');" type="button">Set Cookie Foo</button>
<button onclick="setCookie('adminActiveCalendars', 'Bar');" type="button">Set Cookie Bar</button>

控制台输出:

Load events
Object {cookieValue: null} // initially empty
Set cookie adminActiveCalendars Foo
Response: Object {previousCookieValue: null}
Load events
Response: Object {cookieValue: "Foo"} // first loadEvents request after setting cookie already holds correct value
Set cookie adminActiveCalendars Bar
Response: Object {previousCookieValue: "Foo"}
Load events
Response: Object {cookieValue: "Bar"}

完全重新加载页面后,再加载事件:

Load events
Response: Object {cookieValue: "Bar"} // still here, right from the start

关于替代方法的说明:

  • 在不了解应用程序内部的情况下 - 在客户端设置 cookie 似乎就足够了
  • 或者,如果客户端的其他内容不需要此类信息,则将此类信息存储在 Session 变量中而不是 Cookie 中。 There are some differences。首先,您不必费心处理双方(客户端和服务器)的 cookie。
  • 或者,不要将此信息存储在任何地方 - 将其作为过滤器参数添加到请求中。

原答案:

这不会设置 cookie:

return view('welcome')->withCookie(cookie($cookieName, $cookieVal, 45000));

这样做:

$response = new \Illuminate\Http\Response('Test');
$response->withCookie(cookie($cookieName, $cookieVal, 45000));
return $response;

改编:

【讨论】:

  • 我在视图中使用它,我认为它更好。无论如何,我认为 laravel 在 cookie 和会话之间没有区别,两者都存储在数据库或文件中,不是吗?
  • 无论如何,您提供的代码仍然像我一样工作 -> 我提出请求,它可能已设置但在下一次 ajax 调用中它没有更新,我必须进行下一次 ajax 调用才能看到新值:/
  • 非常感谢@luchaos!有用。我只需要在设置 cookie 后调用下一个 ajax 调用:/ 谢谢
  • 不客气,@JanKožušník!很高兴我能提供帮助,它现在正在工作。
【解决方案2】:

问题是,如果我们想要访问我们在前端设置的 cookie,我们会得到 null 作为值。但是如果我们使用 $_COOKIE 变量,我们可以访问它,这就是 cookie 存在的证据。那有什么问题呢?

默认情况下,框架自带一个用于加密 cookie 的中间件。如果我们从后端设置一个 cookie,它会自动加密,以便 Laravel 可以读取它。从 JS 中我们没有任何加密,这就是为什么我们不能从框架中访问它们。

在app/Http/Kernel.php的web中间件组中,我们可以找到一个EncryptCookies::class

IN 数组请设置您使用 jquery 或 javascript 设置的 cookie 名称

protected $except = [
'cookie-name',
];

【讨论】:

  • 请更新app\Http\Middleware\EncryptCookies.php中的代码
猜你喜欢
  • 1970-01-01
  • 2017-04-04
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2013-07-10
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多