Java Webアプリケーションでドメイン間リクエストをサポート


エンジニアリング協力開発の必要性のため、バックグラウンドのアプリケーションはドメイン間アクセスをサポートすることができますが、このドメイン間アクセスでは「時々良い時も悪い時もある」と、私たちのキックアスが知っているのはjarパッケージを2つ加えて、Filterを声明して、簡単な感じがしますか?!自分がすごいと感じています.幻覚だらけ!!さもないとどうしてよくも悪くもなるの?!この問題を深く理解するために、この文章を書いてまとめることにしました.ドメイン間リクエストを知るには、まず同源ポリシーを理解する必要があります.では、同源とは何ですか.何が違うの?簡単に言えば、HTMLページ、JavaScriptスクリプト、cssスタイルを含む2つのリソースが対応するプロトコル、ドメイン名、ポートが完全に同じであれば、この2つのリソースは同源であり、Same-origin policyはよく説明しています.では、同源ポリシーとは、あるソースのリソースが別のソースのリソースにアクセスすることを意味し、この点でJavaScriptのクロスステーションリソースアクセスがより顕著に表現されている.HTML 5以前はAjaxでは跨局リクエストは許可されていませんでしたが、需要があればJSONPなどの方法が使えますが、デメリットは:
  • Getのみをサポートし、Postはサポートしない.
  • は本質的にスクリプト注入の方式であり、安全上の危険性がある.

  • JSONPのメリットとデメリットもありますが、HTML 5が登場して以来、CORS(クロスステーションリソース共有)という方式が提案され、日常的な開発が極めて便利になりました.CORSの動作原理を理解するには、まずドメイン間アクセスがどのように禁止されているかを知る必要があります.これまで本キックアスはフロントのドメイン間アクセス要求が発行できないと思っていましたが、同源戦略を実現したブラウザがこの要求をブロックしましたが、ブラウザがブロック要求を持っていないことを後で知り、サーバー側が戻ってきた応答をブロックしました.したがって、ドメイン間アクセスをサポートするには、ブラウザとバックグラウンド・サーバ・プログラムが同時にサポートする必要があります.この2つの条件が同時に満たされない場合は、ドメイン間アクセスをサポートできません.
    CORSで使用されるHttpの最初の部分は以下の通りです.
  • 応答ヘッダ
  • Access-Control-Allow-Origin:ドメイン間アクセスを許可するドメインは、ドメインのリストであってもよいし、ワイルドカードであってもよい」*;
  • Access-Control-Allow-Methods:カンマで区切られた使用可能なリクエストメソッド.
  • Access-Control-Allow-Hellow-Headers:カスタムヘッダをカンマで区切ることができ、大文字と小文字が敏感ではありません.
  • Access-Control-Expose-Headers:スクリプトアクセスを許可するリターンヘッダ.リクエストが成功すると、スクリプトはXMLHttpRequestでこれらのヘッダの情報
  • にアクセスできます.
  • Access-Control-Allow-CRedentials:認証情報を持つリクエストを許可するかどうか、XMLHttpRequestリクエストのwithCredentialsフラグをtrueに設定すると、認証が通過し、ブラウザはスクリプトプログラムにデータを渡します.
  • Access-Control-Max-age:今回のリクエストをキャッシュする秒数.この時間範囲では、すべての同型のリクエストが、事前検査リクエストを送信するのではなく、今回返されたヘッダを直接使用することを判断根拠とし、リクエスト回数を大幅に最適化するのに非常に有用である.

  • リクエストヘッダ
  • Origin:通常のHTTPリクエストも付いており、CORSではOrigin情報としてバックエンドペアリングを行い、ソースドメインを示し、応答ヘッダのAccess-Control-Allow-Originと一致してドメイン間アクセスを行うことができる.
  • Access-Control-Request-method:ドメイン間アクセスを行うリクエストメソッドは、応答ヘッダのAccess-Control-Allow-methodsと一致してこそ、ドメイン間アクセスを行うことができる.
  • Access-Control-Request-Headers:カスタムヘッダです.setRequestHeaderメソッドで設定されたヘッダはすべてカンマで区切られた形でこのヘッダに含まれます.応答ヘッダのAccess-Control-Allow-Headersと一致するには、ドメイン間アクセス
  • が必要です.

    ドメイン間アクセスをサポートする範囲から言えば、サーバ全体、単一アプリケーション、単一インタフェースがあります.
    1、サーバー全体でドメイン間アクセスをサポートする
    サーバに複数のアプリケーションを配置できます.サーバ全体でドメイン間アクセスがサポートされている場合は、すべてのアプリケーションで個別に構成する必要はありません.サーバの構成を直接使用すればいいです.ここではtomcatで例を挙げます.Tomcat 7の後にtomcat 7が含まれてからCORSのサポートが開始されますが、以前のバージョンではサポートされていません.CORSを構成し、まずTomcatのconf\web.xmlを構成し、その中に次のようにFilter宣言を追加します.
    
        CORS
        com.thetransactioncompany.cors.CORSFilter
    
    
        CORS
        /*
    
    

    これにより、Tomcatに配備されているすべてのアプリケーションのインタフェースに適用できます.次に、Tomcatのlibフォルダに2つのjarパッケージを追加します.cors-filter-2.5.jarとjava-property-utils-1.9.jarです.この2つのjarパッケージに対応するmaven依存は次のとおりです.
    
        com.thetransactioncompany
        cors-filter
        2.5
    
    

    Tomcatサーバでの構成が完了すると、自分のアプリケーションでドメイン間アクセスに関するコンテンツを構成しないでください.これにより、対応するインタフェースへのアクセス時にドメイン間アクセスがサポートされません.この構成は広範囲にわたって行われており、サーバの下に配置されているアプリケーションではドメイン間アクセスをサポートする必要がなく、セキュリティ上の問題が発生するため、この構成は推奨されません.
    2、バックグラウンドアプリケーション全体でドメイン間アクセスをサポートする
    このアプリケーションの範囲内でドメイン間アクセスをサポートするのは一般的な使用方法であり、この構成には多くの実装方法があります.
    2.1、web.xmlに配置する
    上記のサーバのweb.xmlに構成されているfilterを、独自のエンジニアリングに構成します.次にmaven依存を追加します.次のようにします.
    
        com.thetransactioncompany
        cors-filter
        2.5
    
    

    これにより、ドメイン間アクセス要求のサポートが完了し、すべての要求にドメイン間アクセスをサポートしたくない場合は、Filterのurl-patternで一致するurlアドレスを変更できます.
    2.2.通過WebMvcConfigurer####
    Springでは、このインタフェースを使用してコールバックメソッドを定義することによって、いくつかのSpring MVCで使用する構成を行うことができます.CORSをサポートする方法はaddCorsMappings(CorsRegistry registry)です.このインタフェースを直接使用するのではなく、抽象的な実装クラスWebMvcConfigurerAdapterを使用します.このクラスでは、WebMvcConfigurerインタフェースのメソッドの空の実装を提供しています.私たちは自分のビジネスロジックを直接記入すれば、直接使用することができます.このコールバックメソッドのパラメータはCorsRegistryであり、このクラスは対応するurlアドレスにCORS構成を提供するのに役立ち、このメソッドについてはApplication起動クラスに配置してもよいし、1つのクラスに単独で配置してもよい.
    このメソッドをApplication起動クラスで使用するには、Application起動クラスに次のコードを追加するだけです.
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }
    

    このメソッドを使用する新しいクラスを独自に作成するには、次のように注釈を構成する必要があります.
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = { "com.springboot.demo" })
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/*").allowedOrigins("http://localhost:8070");
        }
    
    }
    
    @Configuration@EnableWebMvcの注釈は、Application起動クラスで使用されるのに比べて多くなっています.これは、@SpringBootApplicationが上記の2つの注釈を含んでいるため、再加入する必要はありません.CorsRegistryaddmappingを呼び出すとCorsRegistrationクラスが得られるが,このときチェーン呼び出しを用いてこのCORS構成に対してorigin,method,header,maxageなどの制限を行うことができ,ここでは展開しない.
    2.3カスタムFilter
    すべての方法は結局インタフェースへのアクセスをブロックすることです.だから、CORSがどのように働いているのかを深く理解したくない場合は、Filterをカスタマイズすることで実現することができますが、実際には難しいことはありません.ブロックに要求と響きにHeadersを加えることです.ここでは言いません.
    3、単一のインタフェースでドメイン間アクセスをサポートする
    ドメイン間アクセスがサポートする最小の範囲は、Controllerおよび対応する方法であり、ここでは@CrossOrigin注釈を使用して対応する構成を完了し、まずこの注釈のソースコードを見てみましょう.
    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface CrossOrigin {
        String[] DEFAULT_ORIGINS = { "*" };
        String[] DEFAULT_ALLOWED_HEADERS = { "*" };
        boolean DEFAULT_ALLOW_CREDENTIALS = true;
        long DEFAULT_MAX_AGE = 1800;
    
        String[] value() default {};
        @AliasFor("value")
        String[] origins() default {};
        String[] allowedHeaders() default {};
        String[] exposedHeaders() default {};
        RequestMethod[] methods() default {};
        String allowCredentials() default "";
        long maxAge() default -1;
    }
    

    この注釈から,方法においてもクラスにおいても使用でき,CORSによって提案された応答ヘッダを完全にカバーしていることが分かる.
  • はクラスで使用され、一般に@Controllerまたは@RestControllerの注釈があるクラスで使用され、このようにクラスではすべてこの注釈が提供するCORSに関する構成に従う.
  • は方法において使用され、CORSの構成は指定された方法にすぎない.

  • デフォルトでは、@CrossOriginは、ドメイン間アクセスのためにすべてのoriginおよびすべてのheadersをサポートし、その制限された方法は、@Requestmappingmethod属性によって提供される.ソースコードを見るとわかりますが、CorsRegistryaddMapping()コンフィギュレーションマッピングを使用する場合、返されるCorsRegistrationクラスのorigin、header、Credentialsのコンフィギュレーションに@CrossOriginのデフォルトコンフィギュレーションが使用されます.例は次のとおりです.
    @CrossOrigin(origins={"http://localhost:8070"}, methods={RequestMethod.GET, RequestMethod.POST})
    @RequestMapping("/")
    @ResponseBody
    public String getInformation(){
        restHandleService.getRestInformation();
        return "spring boot";
    }
    

    関連記事:
  • Enabling Cross Origin Requests for a RESTful Web Service
  • CORS with spring-boot and angularjs not working
  • CORS Support in Spring Framework
  • Using CORS
  • 同源ポリシーおよびドメイン間アクセス
  • CORSドメイン間リソース共有
  • JAVA WEBはCORSドメイン間アクセス
  • をサポートする
  • ドメイン間の別のソリューション-CORS(Cross-Origin Resource Sharing)ドメイン間リソース共有
  • HTTPアクセス制御(CORS)
  • CORS Filter