在Laravel I的帮助下,我创建了一个多语言网站。当我使用Ajax切换语言时,有时会出现错误。 JavaScript代码:
$(document).ready(function(){
$("#LanguageSwitcher").change(function(){
var locale = $(this).val();
var _token = $('meta[name="csrf-token"]').attr('content');
$.ajax({
url: "/language",
type: 'POST',
data: {locale: locale, _token: _token},
datatype: 'json',
beforeSend: function () {
console.log('before send - ' + locale);
},
success: function (data) {
console.log('success');
},
error: function (error) {
console.log(error);
},
complete: function (data) {
window.location.reload(true);
}
});
});
});
web.php:
Route::post('/language/', array(
'before' => 'csrf',
'uses' => 'LanguageController@changeLanguage'
));
控制器:
class LanguageController extends Controller
{
public function changeLanguage(Request $request){
if ($request->ajax()) {
$request->session()->put('locale', $request->locale);
}
}
}
layout.blade.php:
<meta name="csrf-token" content="{{ csrf_token() }}">
<select id="LanguageSwitcher" class="btn btn-outline-danger">
<option>...code...</option>
<option>...code...</option>
<option>...code...</option>
</select>
当我通过另一个浏览器时,一切都可以。如果我经过隐身模式,它也有效。这可以是由于我登录到管理面板吗?
将您的ajax调用像这样。
req = $.ajax({
type: "POST",
url: "/search",
data: {
"locale": locale,
"_token": "{{ csrf_token() }}",
},
dataType: "json",
success: function(msg){
}
});
当我看到您的代码时。您在请求中传递CSRF令牌。您面临的问题是,您的CSRF令牌没有被更新。
假设,您不是在第一次输入页面时重新加载页面,Laravel给您CSRF令牌,您通过meta
提供给Ajax。
,但在后端(Laravel侧(之后。您的CSRF令牌已更新,但是您没有在客户端端更新一个。对于重新加载页面所需的更新。
因此,对于此问题,您需要检查每当获得错误状态419时,请求Laravel以获取新的CSRF代币(通过新路由来获取从Laravel Helper csrf_token()
返回返回AJAX的CSRF令牌并更新到您的文件。并将该令牌发送回Laravel随您的要求。
用于将新令牌更新到您的页面
document.querySelector('meta[name=csrf-token]').setAttribute('content', res.data.csrf);
,也可以通过重新加载页面
在您的刀片视图中添加元标记中的csrf令牌
<meta name="csrf-token" content="{{ csrf_token() }}"/>
在您的ajax函数中:
$.ajax({
url: '/search',
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
type: 'POST',
dataType: 'json',
success: function(response) {
},error:function(err){
}
});
我找到了答案,但仍然不了解它的工作原理,请解释谁理解这一点。 App extesbions handler.php
public function render($request, Exception $exception)
{
// code for updating token when session is expired
if ($exception instanceof IlluminateSessionTokenMismatchException) {
return Redirect::back()->withErrors(['session' => 'Sorry, your session seems to have expired. Try Again']);
}
return parent::render($request, $exception);
}