跨域问题,纯后端,前端访问的时候可能跨域

问题描述:我有一个接口,偶尔跨域,偶尔不跨域,为什么会出现这个情况?
测试猜测:
1.请求没请求过的合同,会出现跨域,在请求可能不会
2.多次频繁的访问接口.也有一次可能不会出现跨域
注:不跨域后在请求就不会跨域了

App\Http\Kernel文件下的protected $middleware加了
\App\Http\Middleware\EnableCrossRequestMiddleware::class,

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Response;

/**
 * 跨域中间件
 */
class EnableCrossRequestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $header=[
            'Access-Control-Allow-Origin' => "*",//允许所有资源跨域
            'Access-Control-Allow-Headers' => 'Origin, Content-Type, Cookie, Accept, Authorization',
            'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, OPTIONS, DELETE, HEAD',//运行的请求方法
            'Access-Control-Allow-Credentials' => 'true'//运行客户端携带证书式访问
        ];

        if ($response instanceof Response) {
            foreach ($header as $key => $value) {
                $response->header($key, $value);
            }
            return $response;
        }

        foreach ($header as $key => $value) {
            $response->headers->set($key, $value);
        }

        return $response;
    }
}
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

跨域的时候,首次访问某个url,会发送options请求。浏览器根据options返回的信息判断是否可以继续,然后才发送postget请求。以后再访问这个url,如果上次options验证了是可以跨域,那就不会再发送options请求,直接postget请求。
中间件需要前置,判断请求类型,如果是options请求就直接设置headers然后返回响应,结束本次请求。中间件后置的话可能会导致接口调用两次。

3年前 评论
ytoz (楼主) 3年前
ytoz (楼主) 3年前
ytoz (楼主) 3年前
讨论数量: 6

跨域的时候,首次访问某个url,会发送options请求。浏览器根据options返回的信息判断是否可以继续,然后才发送postget请求。以后再访问这个url,如果上次options验证了是可以跨域,那就不会再发送options请求,直接postget请求。
中间件需要前置,判断请求类型,如果是options请求就直接设置headers然后返回响应,结束本次请求。中间件后置的话可能会导致接口调用两次。

3年前 评论
ytoz (楼主) 3年前
ytoz (楼主) 3年前
ytoz (楼主) 3年前
ruke

保不准其他问题,导致 探针请求 失败了, 跨域就失败了

3年前 评论
public function handle($request, Closure $next)
{
    header("Access-Control-Allow-Origin: *");
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
        }
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
        }
        exit('ok');//这里结束本次请求
    }
    return $next($request);
}

我其他框架复制过来的,判断请求方式是否为optinons和结束请求exit('ok')是原始写法,可以适当修改为laravel的写法

3年前 评论
ytoz (楼主) 3年前
ichynul (作者) 3年前
ytoz (楼主) 3年前
ytoz (楼主) 3年前
ichynul (作者) 3年前
ytoz (楼主) 3年前

看一下是不是这个原因

对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“”。 这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 http://www.examples.com,则请求将成功执行。

什么是附带身份凭证的请求?

3年前 评论
fffswhk (作者) 3年前

难道不是配置在nginx里面吗?

3年前 评论

分离的前端,在遇到后端报错500状态下也会提示跨域.跨域一般没有时跨时不跨这一说吧.

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!