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

问题描述:我有一个接口,偶尔跨域,偶尔不跨域,为什么会出现这个情况?
测试猜测:
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;
    }
}
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

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

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

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

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

4年前 评论
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 的写法

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

看一下是不是这个原因

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

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

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

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

4年前 评论

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

4年前 评论