Laravel 5.2 无法将跨域 jQuery 方法识别为 AJAX

Posted

技术标签:

【中文标题】Laravel 5.2 无法将跨域 jQuery 方法识别为 AJAX【英文标题】:Laravel 5.2 not recognizing cross-domain jQuery method as AJAX 【发布时间】:2016-05-14 06:07:53 【问题描述】:

Laravel 5.2 无法将跨域 jQuery load() 方法的请求识别为 AJAX:

来自站点一的 jQuery:

 $('#results').load('http://site2.com/test');

站点二的控制器方法:

 public function myMethod(Request $request)
    
        header("Access-Control-Allow-Origin: *");
        header('Access-Control-Allow-Credentials: true');

        if (!$request->ajax()) 
            abort(403, 'Invalid Request');
        
          // do something
    

请求已收到,除了未被识别为 AJAX 请求之外没有其他问题。从同一域调用的 load() 方法被识别为 AJAX。

有什么想法吗?

【问题讨论】:

我虽然你不能这样做,除非由于 jQuery 中的安全问题/限制。您必须使用其他替代方法才能使请求完全正常运行,例如“CORS”。不过,我对 CORS 请求了解不多。 【参考方案1】:

创建一个包含“X-Requested-With”作为允许标头的 CORS 中间件文件:

public function handle($request, Closure $next)
    
        header('Access-Control-Allow-Origin: *');

        $headers = [
            'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers' => 'X-Requested-With, Content-Type, X-Auth-Token, Origin, Authorization'
        ];

        if ($request->getMethod() == "OPTIONS") 
            return Response::make('OK', 200, $headers);
        

        $response = $next($request);
        foreach ($headers as $key => $value)
            $response->header($key, $value);
        return $response;
    

将 jQuery load() 方法替换为 ajax() 并在 jQuery AJAX 调用中添加一个“X-Requested-With”标头:

$.ajax(
     type: 'GET',
     url: 'http://site2.com/test',
     headers: 'X-Requested-With': 'XMLHttpRequest',
     success: function (data)
        
           //do something
        
);

【讨论】:

【参考方案2】:

Laravel 的 HTTP 请求类扩展了 Symfony 的,它检查请求的 X-Requested-With 标头是否设置为“XMLHttpRequest”。默认情况下,此标头不会在使用 jQuery 的跨域请求中发送,除非您禁用其跨域保护:

$.ajax(
    url: 'http://example.com/',
    crossDomain: false
);

【讨论】:

以上是关于Laravel 5.2 无法将跨域 jQuery 方法识别为 AJAX的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 jquery 从 Web API 获取 JSON 响应

C#+.netFrameWork4.5.2+WebAPI+Jquery+Ajax跨域请求问题

将跨域请求阻止到 localhost 的 React 应用程序

Laravel 5.2 - 使用 jquery 自动完成下拉菜单

Jquery:使用 laravel 的跨域 ajax 'POST'

如何将跨域资源共享与 Spring MVC 4.0.0 RESTful Webservice 集成