Maison > cadre php > PensezPHP > Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials

Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials

藏色散人
Libérer: 2021-02-17 09:22:29
avant
2153 Les gens l'ont consulté

Analyse des idées de résolution de problèmes inter-domaines thinkphp withCredentials


thinkphp withCredentials idées de résolution de problèmes inter-domaines

Je n'entrerai pas dans les détails sur ce qu'est le cross-domain. Le sujet principal ici est thinkphp5.1, parlons de la solution générale

Tout d'abord, parce que le front-end est écrit par moi-même, dans la configuration axios, j'ai défini ce qui suit

withCredentials: true // Envoyer un cookie quand requête inter-domaine

// 创建一个axios
const service = axios.create({
  baseURL: URL , 
  withCredentials: true, // 跨域请求时发送cookie
  timeout: 5000 // request timeout
})
Copier après la connexion

dans Dans la configuration du backend,

header("Access-Control-Allow-Origin: *");
Copier après la connexion

est configuré, donc une telle erreur

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.
Copier après la connexion

est générée. La signification est que lors de la configuration de withCredentials. à true, l'origine ne peut pas être * Oui, l'origine doit être définie sur l'adresse source

, c'est-à-dire lorsque http://a.com demande http://b.com , http://a.com doit définir l'origine sur http:// b.com peut passer

Enfin, référez-vous à la configuration comme suit

 $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');
Copier après la connexion

Bien sûr, ça peut aussi être comme ça quand c'est *

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');
Copier après la connexion

Définissez d'abord un middlewarephp 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);
    }
}
Copier après la connexion

Dans router.php

Route::group(&#39;&#39;, function (){
    ....
    这里写路由
    ....
})->middleware(['CrossDomain']);
Copier après la connexion

Ensuite il y a un nouveau problème

Parce que le fichier de routage est utilisé comme ci-dessus, lorsque la requête urlLors de la correspondance des routes, un middleware inter-domaines sera utilisé. Comme chacun le sait, des méthodes telles que delete et put lanceront un. Les options sont demandées à l'avance, ce qui signifie que les fichiers de routage ne peuvent pas correspondre et que le middleware inter-domaines ne peut pas être utilisé

Par conséquent :

Définissez une exception d'erreur pour prendre le relais https://www.kancloud. cn/manual/thinkphp5_1/354092#_42

....
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 `抛出一个响应
}
...
Copier après la connexion

Complet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal