Heim > PHP-Framework > Denken Sie an PHP > Analyse der domänenübergreifenden Problemlösungsideen von thinkphp withCredentials

Analyse der domänenübergreifenden Problemlösungsideen von thinkphp withCredentials

藏色散人
Freigeben: 2021-02-17 09:22:29
nach vorne
2154 Leute haben es durchsucht

Analyse der domänenübergreifenden Problemlösungsideen von thinkphp withCredentials


thinkphp with Credentials Ideen zur domänenübergreifenden Problemlösung

Ich werde hier nicht auf Details eingehen, hier konzentrieren wir uns hauptsächlich auf thinkphp5.1 , Sag mir ungefähr die Lösung

Da das Frontend von mir selbst geschrieben wurde, habe ich in der axios-Konfiguration zunächst Folgendes festgelegt axios配置中, 我设置了如下

withCredentials: true // 跨域请求时发送cookie

// 创建一个axios
const service = axios.create({
  baseURL: URL , 
  withCredentials: true, // 跨域请求时发送cookie
  timeout: 5000 // request timeout
})
Nach dem Login kopieren

在后端的配置中,配置的是

header("Access-Control-Allow-Origin: *");
Nach dem Login kopieren

故而抛出了这样一个错误

Access to XMLHttpRequest at 'http://store.ink/admin/me?sid=lbn3mpacfb3k1mbehnk9qh8kf3' from origin 'http://vue-admin-web.ink' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
Nach dem Login kopieren

意思大概为 设置 withCredentialstrue 时, origin 是不允许为 *的, origin必须设置为来源的地址

也就是 http://a.com 请求 http://b.com 的时候, http://a.com 必须设置origin 为 http://b.com 才能通过

最后参阅配置如下

 $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';
        header("Access-Control-Allow-Origin: $origin");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');
        header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
        header('Access-Control-Max-Age: 1728000');
Nach dem Login kopieren

当然, 为 * 的时候也可以这样

header("Access-Control-Allow-Origin: *");
        header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');
        header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
        header('Access-Control-Max-Age: 1728000');
Nach dem Login kopieren

首先 定义个中间件 php think make:middleware CrossDomain

<?php
namespace app\http\middleware;

use think\Response;


class CrossDomain
{
    public function handle($request, \Closure $next)
    {
        $origin = $_SERVER[&#39;HTTP_ORIGIN&#39;] ?? &#39;*&#39;;
        header("Access-Control-Allow-Origin: $origin");
        header(&#39;Access-Control-Allow-Credentials: true&#39;);
        header(&#39;Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With&#39;);
        header(&#39;Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE&#39;);
        header(&#39;Access-Control-Max-Age: 1728000&#39;);

        return $next($request);
    }
}
Nach dem Login kopieren

router.php

Route::group(&#39;&#39;, function (){
    ....
    这里写路由
    ....
})->middleware(['CrossDomain']);
Nach dem Login kopieren

然后又有一个新问题

因为如上是走的路由文件,当请求的url

withCredentials: true // Cookies bei domänenübergreifender Nutzung senden Anfragen

....
public function render(Exception $e)
{
    # 这里来处理跨域问题 
    $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';
    header("Access-Control-Allow-Origin: $origin");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
    header('Access-Control-Max-Age: 1728000');
    $type = request()->isAjax() ? 'json' : "html";
    $response = \think\response\Json::create([], $type, 200, []);
    return $response; # response  // 在异常处理接管中,必须返回的是一个人response响应, 而不是 `throw new `抛出一个响应
}
...
Nach dem Login kopieren
Konfiguration im Backend, die Konfiguration ist

rrreee

, daher wird ein solcher Fehler

rrreee

ausgegeben, was bedeutet, dass beim Setzen von withCredentials auf true , origin darf nicht * sein, origin muss auf die Quelladresse gesetzt werden
🎜das heißt, wenn http://a.com http://b.com anfordert, http:// a.com muss den Ursprung auf http:// setzen. b.com kann übergeben werden php think make:middleware CrossDomain🎜rrreee🎜 🎜rrreee🎜🎜 in router.php und dann gibt es ein neues Problem 🎜🎜🎜Denn das Obige ist die Routing-Datei, wann Wenn die angeforderte url mit der Route übereinstimmt, wird sie gesendet. Wie jeder weiß, werden domänenübergreifende Middleware-Methoden wie delete und put im Voraus eine Optionsanforderung initiieren, was bedeutet, dass die Routing-Datei nicht abgeglichen werden kann Domänenübergreifende Middleware kann nicht verwendet werden🎜🎜Also:🎜🎜Definieren Sie eine Fehlerausnahmeübernahme https://www.kancloud.cn/manual/thinkphp5_1/354092#_42🎜rrreee🎜Complete. 🎜🎜

Das obige ist der detaillierte Inhalt vonAnalyse der domänenübergreifenden Problemlösungsideen von thinkphp withCredentials. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage