ajax 요청의 label TokenMismatchException
리소스 그룹을 사용하고 있으며 이 필터를 사용하여 확인합니다.TokenMismatchException
문제:
Route::filter('csrf', function($route, $request) {
if (strtoupper($request -> getMethod()) === 'GET') {
return;
// get requests are not CSRF protected
}
$token = $request -> ajax() ? $request -> header('X-CSRF-Token') : Input::get('_token');
if (Session::token() != $token) {
throw new Illuminate\Session\TokenMismatchException;
}
});
내 경로:
Route::group(array('prefix'=> 'admin', 'before' => 'csrf'), function(){
Route::resource('profile' , 'ProfileController', array('as'=>'profile') );
});
이제. 다음 코드와 같은 Ajax 요청에 오류가 발생합니다.
<script type="text/javascript">
$(document).ready(function() {
$('#frm').submit(function(e){
e.preventDefault();
name = $('#name').val();
family = $('#family').val();
email = $('#email').val();
currPassword = $('#currPassword').val();
password = $('#password').val();
password_confirmation = $('#password_confirmation').val();
$.post("{{ route('admin.profile.update', $profile->id) }}",
{
_method : 'PUT',
name : name,
family : family,
email : email,
currPassword : currPassword,
password : password,
password_confirmation : password_confirmation
},
function(data)
{
alert(data.errors.name);
},'json');
return false;
});
});
</script>
오류:
{"error":{"type":"Illuminate\\Session\\TokenMismatchException","message":"","file":"\/var\/www\/alachiq\/app\/filters.php","line":83}}
저는 제가 보내져야 한다고 생각합니다.$.post
하지만 나는 얻을 수 없습니다.input
로 꼬리표를 달다.name
기여하다.다음 오류가 발생했습니다.
TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.
Laravel 문서에 이 작업을 수행하는 방법에 대한 팁이 있습니다.질문 당시에는 이것을 사용할 수 없었을 수도 있지만, 저는 답변과 함께 업데이트해야겠다고 생각했습니다.
http://laravel.com/docs/master/routing#csrf-x-csrf-token
설명서에서 메타태그 방법을 테스트하여 작동시켰습니다.글로벌 템플릿에 다음 메타 태그 추가
<meta name="csrf-token" content="{{ csrf_token() }}">
jQuery의 모든 Ajax 요청에 대한 기본값을 설정하는 이 JavaScript를 추가합니다.가급적이면 앱 전체에 포함된 js 파일에 포함됩니다.
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
})
이 토큰은 요청 헤더 또는 양식에 존재할 수 있습니다.그러면 모든 Ajax 요청의 요청 헤더에 이를 채웁니다.
당신은 _token과 함께 숨겨진 입력을 삽입하고 나중에 당신이 Ajax 게시물의 다른 양식 필드를 가져오듯이 그 값을 얻어야 합니다.
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
또 다른 방법은,
당신은 _token으로 객체를 설정할 수 있습니다.
<script type="text/javascript">
var _globalObj = {{ json_encode(array('_token'=> csrf_token())) }}
</script>
그리고 나중에 Ajax 호출에서 다음과 같은 객체에서 _backet를 얻을 수 있습니다.
var token = _globalObj._token;
당신의 아약스 게시물에 포함시키세요.
다음 코드에서 보여드린 것처럼 간단한 작업만 수행하면 됩니다.
$.ajax({
type: 'POST',
url: 'your-post-route-url',
data: {
"_token": "{{ csrf_token() }}",
"form_data": $('#Form').serialize(),
},
success: function (data) {
console.log(data);
},
error: function (reject) {
console.log(reject);
}
});
저는 이것이 숨겨진 영역 없이 이 문제를 해결하는 가장 쉬운 방법이고 저에게 라벨 5.4 버전으로 작동하기를 바랍니다 :)
도움이 되길 바랍니다.
당신은 또한 당신에게 오류를 제공하는 URL을 추가할 수 있습니다.VerifyCsrfToken.php
에 철하다.
protected $except = [
//
]
당신의 경로가 우편이라고 가정해 보겠습니다.이렇게 추가하시면 됩니다.
protected $except = ['post',
//
];`...
이것이 다른 사람들에게 도움이 되기를 바랍니다.
<html>
<head>
<title>Ajax Example</title>
<meta name="csrf-token" content="<?php echo csrf_token() ?>" />
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
<script>
function getMessage(){
$.ajax({
type:'POST',
url:'/getmsg',
data:'_token = <?php echo csrf_token() ?>',
data:'',
success:function(data){
$("#msg").html(data.msg);
}
});
}
</script>
</head>
<body>
<div id = 'msg'>This message will be replaced using Ajax.
Click the button to replace the message.</div>
<?php
echo Form::button('Replace Message',['onClick'=>'getMessage()']);
?>
</br>
</body>
</html>
그리고.VerifyCsrfToken.php
파일 이 함수를 추가합니다.
protected function tokensMatch($request)
{
// If request is an ajax request, then check to see if token matches token provider in
// the header. This way, we can use CSRF protection in ajax requests also.
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');
return $request->session()->token() == $token;
}
언급URL : https://stackoverflow.com/questions/21627170/laravel-tokenmismatchexception-in-ajax-request
'programing' 카테고리의 다른 글
함수로 인해 발생한 Oracle 11의 테이블 돌연변이 (0) | 2023.08.24 |
---|---|
ngClass는 Angular 2에서 3진 연산자를 사용할 수 있습니까? (0) | 2023.08.24 |
사용자 'root'@'172.19.0.2'(암호 사용: YES)에 대한 액세스가 거부되었습니다(윈도우즈의 경우 도커). (0) | 2023.08.24 |
JavaScript/jQuery에서 쿼리 문자열로 개체 직렬화 (0) | 2023.08.24 |
@angular/core/core에서 Ng serve throwing @에 내보낸 멤버 'eFactoryDef'이 없습니다. (0) | 2023.08.24 |