thinkphp でのセッションのクロスドメイン問題を解決する
ローカルで使用する場合、すべてが正常です。バックエンド プロジェクトとフロントエンド プロジェクトの両方がサーバーにデプロイされ、バックエンド プロジェクトが配置された後はすべてが正常です。ローカル フロントエンド プロジェクトがサーバーにデプロイされ、クロスドメイン アクセスがクロスドメイン アクセスを許可するように設定されている場合、サーバー上でバックエンド プロジェクト インターフェイスを使用すると、問題が発生します。 postman は、イメージ検証コードを取得するためのインターフェイスをテストし、イメージ検証コード インターフェイスを検証します。これは正常です。
次に、インターフェイスを使用して HTML で画像検証コードを取得すると、正常に動作します。最後に、インターフェイスを使用して JS で画像検証コードを検証しますが、エラーが発生します。 ! !
分析問題の説明から、問題がドメイン全体で発生していることがわかります。したがって、可能性は 2 つあり、1 つはクロスドメイン設定が間違っているため、もう 1 つは thinkphp 自体の問題が原因です。
別のクロスドメイン構成を使用しても、問題は依然として存在します。これは thinkphp 自体の問題で、情報を検索したところ、問題は thinkphp のセッション クロスドメインにあることがわかりました。
クロスサブドメイン ソリューション実際、ThinkPHP であっても PHP 自体であっても、セッションのクロスドメインの問題を解決する場合は session.cookie_domain を設定する必要があります。
クロスドメイン セッションの問題の解決策には主に次のようなものがあります:
最初のケース: ディレクトリに .htaccess ファイルがない場合、つまり URL が疑似静的でない場合, 次に、conf/config.php の 1 行目に次のように追加します:
ini_set('session.cookie_domain',".domain.com");//跨域访问Session
デバッグを有効にすると使用できるようになります。ただし、デバッグがオフになっている場合は機能しません。
2 番目のケース: ディレクトリに .htaccess ファイルがある場合は、ルート ディレクトリに、index.php の最初の行を追加します。
この方法では、が有効かどうかに関係なく、デバッグに使用できます。
しかし、私たちの問題はクロスサブドメインの問題ではなく、完全にクロスドメインの問題であるため、上記の方法は無効です。
完全なクロスドメイン ソリューションイメージ検証コードの取得リクエスト
リクエスト情報を表示してイメージ検証コードを取得します。リクエスト ヘッダーは次のとおりです:
Accept:image/webp,image/*,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Connection:keep-alive Cookie:pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=wnpO4gv0eQRW1AMHmGr2ww%3D%3D; pmaUser-1=weZPqS0%2BW7nzFUVHRdqcfA%3D%3D Host:api.voidking.com Referer:http://localhost/ajax/ajax.html User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
レスポンス ヘッダーは:
Access-Control-Allow-Origin:* Cache-Control:post-check=0, pre-check=0 Cache-Control:private, max-age=0, no-store, no-cache, must-revalidate Connection:keep-alive Content-Type:image/png Date:Sun, 27 Nov 2016 12:10:44 GMT Expires:Thu, 19 Nov 1981 08:52:00 GMT Pragma:no-cache Server:nginx Set-Cookie:PHPSESSID=721t4sqanvsii550m1dk8gq1o3; path=/; domain=.voidking.com Transfer-Encoding:chunked
検証検証コードのリクエスト情報を表示します。リクエスト ヘッダーは:
Accept:application/json, text/javascript, */*; q=0.01 Accept-Encoding:gzip, deflate Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Connection:keep-alive Content-Length:9 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Host:api.voidking.com Origin:http://localhost Referer:http://localhost/ajax/ajax.html User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
レスポンス ヘッダーは次のとおりです:
Access-Control-Allow-Origin:* Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection:keep-alive Content-Encoding:gzip Content-Type:text/html; charset=UTF-8 Date:Sun, 27 Nov 2016 12:13:21 GMT Expires:Thu, 19 Nov 1981 08:52:00 GMT Pragma:no-cache Server:nginx Set-Cookie:PHPSESSID=149t0hhs2icqaaemvp39onkgp4; path=/; domain=.voidking.com Transfer-Encoding:chunked Vary:Accept-Encoding
リクエスト ヘッダーは次のとおりです:
Accept:image/webp,image/*,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Cache-Control:max-age=0 Connection:keep-alive Cookie:pma_lang=zh_CN; pma_collation_connection=utf8_unicode_ci; pma_iv-1=wnpO4gv0eQRW1AMHmGr2ww%3D%3D; pmaUser-1=weZPqS0%2BW7nzFUVHRdqcfA%3D%3D; PHPSESSID=721t4sqanvsii550m1dk8gq1o3 Host:api.voidking.com Referer:http://localhost/ajax/ajax.html User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
レスポンス ヘッダーは次のとおりです:
Access-Control-Allow-Origin:* Cache-Control:private, max-age=0, no-store, no-cache, must-revalidate Cache-Control:post-check=0, pre-check=0 Connection:keep-alive Content-Type:image/png Date:Sun, 27 Nov 2016 13:26:21 GMT Expires:Thu, 19 Nov 1981 08:52:00 GMT Pragma:no-cache Server:nginx Transfer-Encoding:chunked
#画像検証コード リクエストを初めて取得するときは、Cookie に PHPSESSID がありません。したがって、戻り情報には Set-Cookie が含まれます。 2 回目の画像認証コード取得リクエストでは、Cookie に PHPSESSID が含まれているため、戻り情報に Set-Cookie は含まれません。
そして、最初のリクエストで返される情報 Set-Cookie 内の PHPSESSID は、2 番目のリクエストのリクエスト情報 Cookie 内の PHPSESSID と同じです。
画像検証コードを検証するajaxリクエストにはCookieがなく、当然PHPSESSIDもないため、戻り情報にもSet-Cookieが含まれます。
Cookie を使用してリクエストを送信するには、フロントエンドでいくつかの変更を加える必要があることがわかります。
フロントエンド jquery 設定<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery</title>
</head>
<body>
<p>
<img src="/static/imghw/default1.png" data-src="http://api.voidking.com/owner-bd/index.php/Home/CheckCode/getPicCode" class="lazy" alt="">
<input type="text" id="picCode">
<input type="button" id="send" value="验证">
</p>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
$(function(){
$('#send').click(function(){
//console.log(document.cookie);
$.ajax({
url: 'http://api.voidking.com/owner-bd/index.php/Home/CheckCode/checkPicCode',
type: 'POST',
crossDomain: true,
xhrFields: {
withCredentials: true
},
dataType: 'json',
data: {code: $('#picCode').val()},
success: function(data){
console.log(data);
},
error: function(xhr){
console.log(xhr);
}
});
});
});
</script>
</body>
</html>
A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.
クロスドメイン エラーが発生しました。クロスドメイン Cookie を受信できるように、バックエンドもいくつかの変更を加える必要があります。
バックエンド nginx 設定add_header Access-Control-Allow-Origin http://localhost;
add_header Access-Control-Allow-Credentials true;
バックエンド nginx がセットアップされると、jquery の ajax リクエストは正常に実行され、Cookie を送信できるようになり、バックエンドは正常にデータを受信してデータを返します。
Angular の ajax リクエストは jquery とは異なるため、Angular が Cookie を含むクロスドメイン リクエストをどのように送信するかを研究する必要もあります。
フロントエンドの角度設定以上がthinkphp でのセッションのクロスドメイン問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>angular</title>
<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body ng-app="myApp" >
<p ng-controller="myCtrl">
<img src="/static/imghw/default1.png" data-src="http://api.voidking.com/owner-bd/index.php/Home/CheckCode/getPicCode" class="lazy" alt="">
<input type="text" id="picCode" ng-model="picCode">
<input type="button" ng-click="send()" value="验证">
</p>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http, $httpParamSerializer) {
$scope.send = function(){
$http({
method:'POST',
url:'http://api.voidking.com/owner-bd/index.php/Home/CheckCode/checkPicCode',
headers:{
'Content-Type':'application/x-www-form-urlencoded'
},
withCredentials: true,
dataType: 'json',
data: $httpParamSerializer({code: $scope.picCode})
}).then(function successCallback(response) {
console.log(response.data);
$scope.username = response.data.username;
}, function errorCallback(response) {
console.log(response.data);
});
}
});
</script>
</body>
</html>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











ThinkPHP プロジェクトを実行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を実行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

ThinkPHP には、さまざまな PHP バージョン向けに設計された複数のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 ThinkPHP ルート ディレクトリを指す仮想ホスト (オプション) を作成します。データベース接続パラメータを構成します。 Webサーバーを起動します。 ThinkPHP アプリケーションを初期化します。 ThinkPHP アプリケーションの URL にアクセスして実行します。

ThinkPHP のインストール手順: PHP、Composer、および MySQL 環境を準備します。 Composer を使用してプロジェクトを作成します。 ThinkPHP フレームワークと依存関係をインストールします。データベース接続を構成します。アプリケーションコードを生成します。アプリケーションを起動し、http://localhost:8000 にアクセスします。

Laravel フレームワークと ThinkPHP フレームワークのパフォーマンスの比較: ThinkPHP は、最適化とキャッシュに重点を置いて、一般に Laravel よりもパフォーマンスが優れています。 Laravel は優れたパフォーマンスを発揮しますが、複雑なアプリケーションの場合は、ThinkPHP の方が適している可能性があります。

「開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法」 インターネット技術の急速な発展に伴い、Web アプリケーションには、多数の同時リクエストと複雑なビジネス ロジックを処理するための要件がますます高まっています。システムのパフォーマンスとユーザー エクスペリエンスを向上させるために、開発者は多くの場合、電子メールの送信、ファイルのアップロードの処理、レポートの生成など、時間のかかる操作を実行するために非同期タスクの使用を検討します。 PHP の分野では、人気のある開発フレームワークとして ThinkPHP フレームワークが、非同期タスクを実装するための便利な方法をいくつか提供しています。

ThinkPHP は、キャッシュ メカニズム、コードの最適化、並列処理、データベースの最適化などの利点を備えた高性能 PHP フレームワークです。公式パフォーマンステストでは、1秒あたり10,000以上のリクエストを処理できることが示されており、実際のアプリケーションではJD.comやCtripなどの大規模なWebサイトやエンタープライズシステムで広く使用されています。

ThinkPHP6 バックエンド管理システム開発: バックエンド機能の実装 はじめに: インターネット技術の継続的な発展と市場の需要に伴い、ビジネス データの管理と運用管理を行うために、効率的で安全かつ柔軟なバックエンド管理システムを必要とする企業や組織がますます増えています。この記事では、ThinkPHP6 フレームワークを使用して、権限制御、データの追加、削除、変更、クエリなどの基本機能を含む、シンプルだが実用的なバックエンド管理システムを開発する方法を例を通して説明します。環境の準備 始める前に、PHP、MySQL、Comをインストールする必要があります
