【发布时间】:2016-06-28 15:13:28
【问题描述】:
我正在通过教程处理这个项目,但是当我尝试将新类别添加到视图中时,我在 VerifyCsrfToken.php 第 67 行中得到了这个 TokenMismatchException 错误,我尝试了互联网上的所有内容:- 添加
<input type="hidden" name="_token" value="{{ Session::token() }}">
或添加
<meta name="csrf-token" content="{{ csrf_token() }}" />
我的代码也删除了 CSRF middileware 没有任何效果
这里是原代码
观点
@extends('layouts.admin-master')
@section('styles')
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet" href="{{ URL::secure('src/css/categories.css') }}" type="text/css" />
@endsection
@section('content')
<div class="container">
<section id="category-admin">
<form action="" method="post">
<div class="category-input">
<label for="name">Category Name</label>
<input type="text" name="name" id="name">
<button type="submit" class="btn">Create Category</button>
</div>
</form>
</section>
<section class="list">
@foreach($categories as $category)
<article>
<div class="category-info" data-id="{{ $category->id }}">
<h3>{{ $category->name }}</h3>
</div>
<div class="edit">
<nav>
<ul>
<li class="category-edit"><input type="text"></li>
<li><a href="">Edit</a></li>
<li><a href="" class="danger">Delete</a></li>
</ul>
</nav>
</div>
</article>
@endforeach
</section>
@if($categories->lastPage() > 1)
<section class="pagination">
@if($categories->currentPage() !== 1)
<a href="{{ $categories->previousPageUrl() }}"><i class="fa fa-caret-left"></i> </a>
@endif
@if($categories->currentPage() !== $categories->lastPage())
<a href="{{ $categories->nextPageUrl() }}"><i class="fa fa-caret-right"></i> </a>
@endif
</section>
@endif
</div>
@endsection
@section('scripts')
<script type="text/javascript">
var token = "{{ Session::token() }}";
</script>
<script type="text/javascript" src="{{ URL::secure('src/js/categories.js') }}"></script>
@endsection
这里是控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Category;
use Illuminate\Support\Facades\Response;
class CategoryController extends Controller{
public function getCategoryIndex()
{
$categories = Category::orderBy('created_at', 'desc')->paginate(5);
return view('admin.blog.categories',['categories' => $categories]);
}
public function postCreateCategory(Request $request)
{
$this->validate($request, [
'name' => 'required|unique:categories'
]);
$category = new Category();
$category->name = $request['name'];
if($category->save()){
return Response::json(['message' => 'Category Created Successfully!'], 200);
}
return Response::json(['message' => 'Error During Creation'], 404);
}
}
这就是Js文件
var docReady = setInterval(function(){
if (document.readyState !== "complete"){
return;
}
clearInterval(docReady);
document.getElementsByClassName('btn')[0].addEventListener('click',createNewCategory);
var _token = document.getElementsByName('_token')[0].value;
//and append the value to form data
formdata.append("_token", _token);
},100);
function createNewCategory(event) {
event.preventDefault();
var name = event.target.previousElementSibling.value;
if(name.length === 0) {
alert("Please A Valid Category Name!");
return;
}
ajax("POST","/admin/blog/category/create", "name=" + name, newCategoryCreated, [name]);
}
function newCategoryCreated(params, success, responseObj){
location.reload();
}
function ajax(method, url, params, callback, callbackParams){
var http;
if (window.XMLHttpRequest){
http = new XMLHttpRequest();
}else {
http = new ActiveXObject("Microsoft.XMLHTTP");
}
http.onreadystatechange = function(){
if (http.readyState == XMLHttpRequest.DONE){
if (http.status == 200){
var obj = JSON.parse(http.responseText);
callback(callbackParams, true, obj);
}else if(http.status ==400){
alert("Category Could Not Be Saved. Please Try Again");
callback(callbackParams, false);
}else {
var obj = JSON.parse(http.responseText);
if (obj.message){
alert(obj.message);
}else {
alert("Please Check The Name");
}
}
}
}
http.open(method, baseUrl + url, true);
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
http.send(params + "&_token=" + token);
}
这就是路线
Route::post('/blog/category/create',[
'uses' => 'CategoryController@postCreateCategory',
'as' => 'admin.blog.category.create'
]);
Route::get('/blog/categories',[
'uses' => 'CategoryController@getCategoryIndex',
'as' => 'admin.blog.categories'
]);
请帮我解决这个错误我已经坚持了三天了
【问题讨论】:
-
你最好像这样设置一个 X-CSRF-TOKEN: http.setRequestHeader('X-CSRF-TOKEN', token);因为 Laravel 在标头中接受令牌。如果我没记错的话,你想要发送它的方式是 GET 请求而不是 POST。
-
能否请您详细说明一下,我还是 laravel 的初学者,谢谢您的帮助
-
在表单中使用 {{ csrf_field() }} 或者你也可以禁用令牌验证
-
这样做了,我得到了这个错误:RouteCollection.php 第 218 行中的 MethodNotAllowedHttpException
-
你看到 http.setRequestHeader('X-Requested-With', 'XMLHttpRequest');只需在它下面添加我给你的行。这会将令牌作为标头传递。
标签: laravel laravel-5.2