【问题标题】:laravel 5.2 valid ajax requestlaravel 5.2 有效的ajax请求
【发布时间】:2016-01-03 00:57:21
【问题描述】:

如果请求是有效的 ajax 请求,我们如何检查 Laravel 5.2。在 codeigniter 中,我们可以像 $this->input->is_ajax_request() 一样检查它。 Laravel 5.2 有类似的东西吗?

另外,我想知道我们如何验证对 csrf 令牌的请求。如果我让我的网页通过生成 csrf 令牌的“web”中间件呈现,然后将此令牌作为 ajax 请求参数传递,是否可以? Laravel 会负责验证令牌还是有替代方法?

我查看了 laravel 5.2 文档,由于这是我第一次处理 laravel 框架,因此文档似乎假设读者已经熟悉该框架的早期版本。对于像我这样的新人来说,这有点压倒性。

提前致谢。如果您需要我提供更多信息,请告诉我。

普拉卡

【问题讨论】:

    标签: php ajax laravel-5.2


    【解决方案1】:

    我认为这可能会帮助您理解在 Laravel 中使用 AJAX 的一种非常基本的方式。

    这是一段非常古老的代码,但它可以正常工作

    控制器端:

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function getRamos(Request $request)
    {
        $check = Ramo::find($request->input('ramo'));
        $subramos = Subramo::where('ramo_id', $check->id)->get(['nombre_subramo']);
        if($request->ajax()){
            return response()->json([
                'subramos' => $subramos
            ]);
        }
    }
    

    在前面:

    <script>
        $(document).ready(function(){
            $('#ramo').change(function(){
                var ramo, token, url, data;
                token = $('input[name=_token]').val();
                ramo = $('#ramo').val();
                url = '{{route('getRamos')}}';
                data = {ramo: ramo};
                $('#subramos').empty();
                $.ajax({
                    url: url,
                    headers: {'X-CSRF-TOKEN': token},
                    data: data,
                    type: 'POST',
                    datatype: 'JSON',
                    success: function (resp) {
                        $.each(resp.subramos, function (key, value) {
                            $('#subramos').append('<option>'+ value.nombre_subramo +'</option>');
                        });
                    }
                });
            });
        });
    </script>
    

    考虑将“#ramo”作为选择输入,并使用 style / html 包,其中令牌作为隐藏输入传递。

    【讨论】:

      【解决方案2】:

      在 Laravel 5.2 中(我希望任何人都可以从这段 Ajax 代码中获得帮助)

      在函数中获取ajax请求,下面两个函数示例:

      第一个例子

      public function getLev() {
          if (!Request::ajax())
              return false;
          $result = Input::all();
          $lev_id = (int) $result['lev_id'];
          $invoiceid = (int) $result['invoiceid'];
          return SuppliersController::getLev($invoiceid,$lev_id);//you can do any thing with your variables
      //function is working in my case, you case take idea from this function
      }
      

      第二个例子

      public function deleteInvoice() {
          if (Request::ajax()) {
              $data = Input::all();
              return delete_invoice($data['invoice_id'], $data['reason_text']);//you can do any thing with your variables
          }
          return false;
      //function is working in my case, you case take idea from this function
      }
      

      将这些文件包含在您编写以上 ajax 相关函数的页面/控制器顶部:

      use Illuminate\Support\Facades\Input;
      use Illuminate\Support\Facades\Request;
      

      【讨论】:

        【解决方案3】:

        如果请求是有效的 ajax 请求,我们如何检查 Laravel 5.2。在 codeigniter 中,我们可以像 $this->input->is_ajax_request() 一样检查它。 Laravel 5.2 有类似的东西吗?

        Request 类具有an ajax() function,因此$request-&gt;ajax()Request::ajax()(取决于您在控制器中获取请求的方式)可以解决问题。

        另外,我想知道我们如何验证对 csrf 令牌的请求。如果我让我的网页通过生成 csrf 令牌的“web”中间件呈现,然后将此令牌作为 ajax 请求参数传递,是否可以? Laravel 会负责验证令牌还是有替代方法?

        是的,通过 AJAX 调用传递令牌并确保您的路由具有 CSRF 中间件(尝试不带令牌的请求 - 它应该会引发错误)。示例在文档中:https://laravel.com/docs/5.2/routing#csrf-x-csrf-token

        【讨论】:

        • 感谢您的输入。我进一步检查了文档,可以找到有关 $request->ajax() 函数的更多信息。
        • @Prakhar 文档中并未涵盖所有内容,它们旨在涵盖最常用的部分。有时您必须查看 API 文档。
        【解决方案4】:

        每当您在应用程序中定义 HTML 表单时,您应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件能够验证请求。

        要生成包含 CSRF 令牌的隐藏输入字段 _token,您可以使用 csrf_field 辅助函数:

        所以要使用带有 POST 方法的 AJAX 请求,您需要将隐藏的 CSRF 令牌字段与 ajax 数据一起传递:

        <script>
        
        var token="<?php echo csrf_token(); ?>";
        
        $.ajax({
        
          url:url,
          method:'POST',
          data:{
            '_token':token,
            'id':1    
          }
        
        
        })
        
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-17
          • 1970-01-01
          • 1970-01-01
          • 2013-09-28
          • 2016-05-08
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          相关资源
          最近更新 更多