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 自动完成下拉菜单