ホームページ >php教程 >PHP开发 >クロスクロスドメイン構成

クロスクロスドメイン構成

高洛峰
高洛峰オリジナル
2016-12-14 13:14:301309ブラウズ

フロントエンド アプリケーションは静的サイトであり、http://web.xxx.com ドメインの下にデプロイされます。バックエンド アプリケーションは REST API を公開し、http://api.xxx.com ドメインの下にデプロイされます。 . AJAX を介してフロントエンド アプリケーションをクロスドメインにする方法 バックエンド アプリケーションにアクセスする場合はどうすればよいでしょうか。これには CORS テクノロジーを使用する必要がありますが、これが現時点で最良のソリューションです。

[CORS は、Cross Origin Resource Sharing (クロスドメイン リソース共有) の略です。サーバーは、クライアントが AJAX クロスドメイン リクエストを発行できるようにするために、関連する応答ヘッダー情報を追加するだけで済みます。 ]

CORS テクノロジーは非常にシンプルで実装が簡単です。現在、ほとんどのブラウザーはすでにこのテクノロジーをサポートしています (IE8 ブラウザーもサポートしています)。CORS 応答ヘッダーを記述できる限り、サーバーは任意のプログラミング言語を使用して実装できます。オブジェクト内の応答に組み込みます。

次に、引き続き REST フレームワークを拡張し、CORS テクノロジーを介して AJAX クロスドメイン アクセスを実装します。

まず、すべての HTTP リクエストをフィルタリングするフィルターを作成し、CORS 応答ヘッダーを応答オブジェクトに書き込む必要があります。コードは次のとおりです。

public class CorsFilter implements Filter {  
  
    private String allowOrigin;  
    private String allowMethods;  
    private String allowCredentials;  
    private String allowHeaders;  
    private String exposeHeaders;  
  
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        allowOrigin = filterConfig.getInitParameter("allowOrigin");  
        allowMethods = filterConfig.getInitParameter("allowMethods");  
        allowCredentials = filterConfig.getInitParameter("allowCredentials");  
        allowHeaders = filterConfig.getInitParameter("allowHeaders");  
        exposeHeaders = filterConfig.getInitParameter("exposeHeaders");  
    }  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest request = (HttpServletRequest) req;  
        HttpServletResponse response = (HttpServletResponse) res;  
        if (StringUtil.isNotEmpty(allowOrigin)) {  
            List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));  
            if (CollectionUtil.isNotEmpty(allowOriginList)) {  
                String currentOrigin = request.getHeader("Origin");  
                if (allowOriginList.contains(currentOrigin)) {  
                    response.setHeader("Access-Control-Allow-Origin", currentOrigin);  
                }  
            }  
        }  
        if (StringUtil.isNotEmpty(allowMethods)) {  
            response.setHeader("Access-Control-Allow-Methods", allowMethods);  
        }  
        if (StringUtil.isNotEmpty(allowCredentials)) {  
            response.setHeader("Access-Control-Allow-Credentials", allowCredentials);  
        }  
        if (StringUtil.isNotEmpty(allowHeaders)) {  
            response.setHeader("Access-Control-Allow-Headers", allowHeaders);  
        }  
        if (StringUtil.isNotEmpty(exposeHeaders)) {  
            response.setHeader("Access-Control-Expose-Headers", exposeHeaders);  
        }  
        chain.doFilter(req, res);  
    }  
  
    @Override  
    public void destroy() {  
    }  
}

上記の CorsFilter は、関連するフィルター初期化パラメーターを web.xml から読み取ります。これらのパラメーターは、HTTP 要求を処理するときに、対応する CORS 応答ヘッダーに書き込まれます。これらの CORS 応答ヘッダーの意味を大まかに説明します。


Access-Control-Allow-Origin: クライアントのドメイン名。アクセスが許可されます。例: http://web.xxx.com。* の場合、どのドメインからでもアクセスできる、つまり制限がないことを意味します。

Access-Control-Allow-Methods: アクセスを許可するメソッド名。GET、POST、PUT、DELETE、OPTIONS など、複数のメソッド名はカンマで区切られます。

Access-Control-Allow-Credentials: クライアント ドメインで Cookie を取得する場合は、検証情報を含むリクエストを許可するかどうかを true に設定する必要があります。

Access-Control-Allow-Headers: サーバーへのアクセスを許可するクライアント要求ヘッダー。複数の要求ヘッダーはカンマで区切られます。例: Content-Type。

Access-Control-Expose-Headers: クライアントのアクセスを許可するサーバー応答ヘッダー。複数の応答ヘッダーはカンマで区切られます。

CORS 仕様では、Access-Control-Allow-Origin では * または特定のドメイン名の 2 つの値のみが許可されると定義されていることに注意してください。つまり、複数のドメイン名の同時構成はサポートされていません。複数のドメインにわたる問題を解決するには、コード内でいくつかの処理を行う必要があります。ここでは、フィルター初期化パラメーターをドメイン名のコレクションとして使用します (カンマで区切ります)。現在のリクエストから Origin リクエスト ヘッダーを取得するだけです。リクエストが上記の許可されたドメイン名セットに含まれている場合は、Access-Control-Allow-Origin 応答ヘッダーに入れられるため、複数のドメインをまたぐ問題は簡単に解決できます。

以下は Web で CorsFilter を設定する方法です。ユーザーがログインしていないときに任意に呼び出すことができます。これは明らかに安全ではありません。 REST リクエストにセキュリティ メカニズムを提供する必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。