2015-07-03 70 views
1
url = '{{route("ajaxSendmsg")}}'; 
      console.log(url); 
      $.ajax({ 
       url: url, 
       data : {comment_id:comment_id}, 
       type: "POST", 
       dataType: "json", 
       success : function(response){ 
        alert(response); 
       }, 
       error : function(res){ 
console.log(res); 
       } 

      }); 

路线:在laravel发送Ajax请求5

Route::post('/ajaxSend', ['as'=> 'ajaxSendmsg', 'uses'=>'[email protected]']); 

控制器:

public function ajaxSend(){ 

     if(Request::ajax()){ 

     return Response::json(['success' => 1]); 
     } 

    } 

错误:TokenMismatchException在VerifyCsrfToken.php线53:

我想送ajax请求,但它不起作用。 :/

+1

您可能已禁用路由的CSRF令牌中间件,或者每次请求发送它。有一个帮助函数'csrf_token()'可以让你获得当前的令牌。中间件将在查询或后缀字符串或“X-CSRF-TOKEN”HTTP标头中查找名为“_token”的字段。 http://laravel.com/docs/master/routing#csrf-x-csrf-token – Quasdunk

+0

@Quasdunk它现在的作品,非常感谢! :)) –

回答

5

默认情况下,Laravel在非读取HTTP请求(如POST,PUT或PATCH)上有一个中间件来防止Cross Site Request Forgery。在每个响应中,都会生成一个令牌,然后预计后续请求会沿着该令牌发送。如果令牌匹配,一切都很好,如果没有(或者如果请求根本不提供令牌),这可能是CSRF的一个漏洞。

有几种方法去这个问题:

  1. app/Http/Kernel.php注释掉它完全禁用中间件 - 显然不是个好主意。
  2. 禁用它只为你确定你不通过重写用自己的缺省中间件需要它的路线:

``

<?php namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; 
use Illuminate\Support\Str; 

class VerifyCsrfToken extends BaseVerifier 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure     $next 
    * 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Str::startsWith($request->getRequestUri(), 'some/open/route') { 
      return $next($request); 
     } 

     return parent::handle($request, $next); 
    } 
} 
  • 只需在请求正文中发送,请求请求正文为_token,请求字符串为_token或作为HTTP标头名称为X-CSRF-TOKEN。您可以使用辅助函数csrf_token()得到它:
  • ``

    .ajax({ 
        url: url, 
        data : {comment_id:comment_id, "_token":"{{ csrf_token() }}"}, 
        type: "POST", 
        dataType: "json", 
        .... 
    }); 
    
    +0

    使用ajax验证错误后,无法使用相同标记重新提交表单。 – mvladk

    0

    使用Ajax请求,并laravel5响应。你应该像这样发送令牌。 ::::::::

    AJAX文件::

     <input type="hidden" value="{{ csrf_token() }}" id="_token" name="_token" /> 
    
    $.ajax({ 
          type: 'POST', 
          url:'{{url("set-visitor")}}' , 
          data: {id: '2', _token: $('#_token').val()}, 
          dataType: 'html', 
          success: function(data){ 
           var rep = JSON.parse(data); 
           console.log(data); 
           if(rep.code == 200) 
           { 
            console.log(rep); 
           } 
           else{ 
            console.log('error'); 
           } 
          } 
         }); 
    

    和控制器文件::

    public function set_visitor() 
    { 
        $id = request('id'); 
        $_token = request('_token'); 
        return Response::json($_token); 
    
    } 
    

    好运:♥♥: