Vue-Resource 在 Ajax POST 调用中给出 TokenMismatchException

Vue-Resource gives TokenMismatchException in Ajax POST call

请注意,我使用的是 Laravel 框架。 另请注意,SO 上也有类似的问题,我已经检查过了,但无法根据这些解决方案解决我的问题...

尽管据我所知我设置了我的 CSRF 令牌,但我不确定为什么它不起作用。

检查控制台时,我似乎有 3 个 cookie:两个请求 cookie,其中一个称为 XSRF-TOKEN,一个称为 laravel_session。还有一个响应 laravel_session cookie。都有不同的价值!!!

我的 Vue:

new Vue({
    el:'body',
    http: {
        root: '/root',
        headers: {
            'X-CSRF-Token': $('meta[name=_token]').attr('content')
        }
    },  
});

我的头:

<meta name="_token" content="{!! csrf_token() !!}"/>

我的Vue组件addNew方法:

Vue.component('things',{
    template:'#things-panel-template',
    data(){
        return {
            list: [],
            newThing: {
                body: '',
                // _token: $('meta[name=_token]').attr('content'),
                // tried removing token from head meta and adding up here.
            },
        }
    },
    methods:{
        addNew(){
            var thing = this.newThing; // get input
            this.newThing = {body:''}; // clear input
            this.$http.post('/api/things/add',thing) // send
        },
    },
});

我的路线:

Route::post('/api/things/add',function(){
    return App\Thing::create(Request::get());
});

最后,我的 Vue 模板中的表单:

<form action="/things/add"
        method="POST"
        @submit.prevent="addNew"
    >
        <div class="form-group">
            {{ csrf_field() }}
            <label for="">Add</label>
            <input type="text"
                name="body"
                id="task-body"
                class="form-control"
                v-model="newThing.body"
            >
            <button :disabled="!isValid"
                class="btn btn-primary"
                type="submit"
            >Add</button>
        </div>
    </form>

试试这个:

this.$parent.$http.post('/api/things/add', thing)

而不是

this.$http.post('/api/things/add', thing)

或者使用全局配置设置默认值:

Vue.http.headers.common['X-CSRF-TOKEN'] = $('meta[name=_token]').attr('content');

我自己找到了答案:

如果您要使用 vue-component,您应该将令牌添加到该组件。 否则它不会与您的 ajax 请求。 所以将这部分放在组件中的模板下面:

    http: {
        root: '/root',
        headers: {
            'X-CSRF-Token': $('meta[name=_token]').attr('content')
        }
    },  

执行此操作以检查您的令牌是否已在 headers:

中正确发送
  1. 转到 google chrome,打开 dev-tools,转到网络选项卡并重新加载。
  2. 调用 ajax 并查看添加到网络选项卡中的文件,打开它并转到 'Headers' 选项卡。
  3. 查看底部显示的内容:'Request Headers' 并检查请求中是否正确添加了令牌。