Java Webアプリケーションでドメイン間リクエストをサポート
7816 ワード
エンジニアリング協力開発の必要性のため、バックグラウンドのアプリケーションはドメイン間アクセスをサポートすることができますが、このドメイン間アクセスでは「時々良い時も悪い時もある」と、私たちのキックアスが知っているのはjarパッケージを2つ加えて、Filterを声明して、簡単な感じがしますか?!自分がすごいと感じています.幻覚だらけ!!さもないとどうしてよくも悪くもなるの?!この問題を深く理解するために、この文章を書いてまとめることにしました.ドメイン間リクエストを知るには、まず同源ポリシーを理解する必要があります.では、同源とは何ですか.何が違うの?簡単に言えば、HTMLページ、JavaScriptスクリプト、cssスタイルを含む2つのリソースが対応するプロトコル、ドメイン名、ポートが完全に同じであれば、この2つのリソースは同源であり、Same-origin policyはよく説明しています.では、同源ポリシーとは、あるソースのリソースが別のソースのリソースにアクセスすることを意味し、この点でJavaScriptのクロスステーションリソースアクセスがより顕著に表現されている.HTML 5以前はAjaxでは跨局リクエストは許可されていませんでしたが、需要があればJSONPなどの方法が使えますが、デメリットは:は は本質的にスクリプト注入の方式であり、安全上の危険性がある.
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の
これにより、Tomcatに配備されているすべてのアプリケーションのインタフェースに適用できます.次に、Tomcatのlibフォルダに2つのjarパッケージを追加します.cors-filter-2.5.jarとjava-property-utils-1.9.jarです.この2つのjarパッケージに対応するmaven依存は次のとおりです.
Tomcatサーバでの構成が完了すると、自分のアプリケーションでドメイン間アクセスに関するコンテンツを構成しないでください.これにより、対応するインタフェースへのアクセス時にドメイン間アクセスがサポートされません.この構成は広範囲にわたって行われており、サーバの下に配置されているアプリケーションではドメイン間アクセスをサポートする必要がなく、セキュリティ上の問題が発生するため、この構成は推奨されません.
2、バックグラウンドアプリケーション全体でドメイン間アクセスをサポートする
このアプリケーションの範囲内でドメイン間アクセスをサポートするのは一般的な使用方法であり、この構成には多くの実装方法があります.
2.1、
上記のサーバのweb.xmlに構成されているfilterを、独自のエンジニアリングに構成します.次にmaven依存を追加します.次のようにします.
これにより、ドメイン間アクセス要求のサポートが完了し、すべての要求にドメイン間アクセスをサポートしたくない場合は、Filterのurl-patternで一致するurlアドレスを変更できます.
2.2.通過
Springでは、このインタフェースを使用してコールバックメソッドを定義することによって、いくつかのSpring MVCで使用する構成を行うことができます.CORSをサポートする方法は
このメソッドをApplication起動クラスで使用するには、Application起動クラスに次のコードを追加するだけです.
このメソッドを使用する新しいクラスを独自に作成するには、次のように注釈を構成する必要があります.
2.3カスタムFilter
すべての方法は結局インタフェースへのアクセスをブロックすることです.だから、CORSがどのように働いているのかを深く理解したくない場合は、Filterをカスタマイズすることで実現することができますが、実際には難しいことはありません.ブロックに要求と響きにHeadersを加えることです.ここでは言いません.
3、単一のインタフェースでドメイン間アクセスをサポートする
ドメイン間アクセスがサポートする最小の範囲は、Controllerおよび対応する方法であり、ここでは
この注釈から,方法においてもクラスにおいても使用でき,CORSによって提案された応答ヘッダを完全にカバーしていることが分かる.はクラスで使用され、一般に は方法において使用され、CORSの構成は指定された方法にすぎない.
デフォルトでは、
関連記事: 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
Get
のみをサポートし、Post
はサポートしない.JSONPのメリットとデメリットもありますが、HTML 5が登場して以来、CORS(クロスステーションリソース共有)という方式が提案され、日常的な開発が極めて便利になりました.CORSの動作原理を理解するには、まずドメイン間アクセスがどのように禁止されているかを知る必要があります.これまで本キックアスはフロントのドメイン間アクセス要求が発行できないと思っていましたが、同源戦略を実現したブラウザがこの要求をブロックしましたが、ブラウザがブロック要求を持っていないことを後で知り、サーバー側が戻ってきた応答をブロックしました.したがって、ドメイン間アクセスをサポートするには、ブラウザとバックグラウンド・サーバ・プログラムが同時にサポートする必要があります.この2つの条件が同時に満たされない場合は、ドメイン間アクセスをサポートできません.
CORSで使用されるHttpの最初の部分は以下の通りです.
ドメイン間アクセスをサポートする範囲から言えば、サーバ全体、単一アプリケーション、単一インタフェースがあります.
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つの注釈を含んでいるため、再加入する必要はありません.CorsRegistry
でaddmapping
を呼び出すと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に関する構成に従う.デフォルトでは、
@CrossOrigin
は、ドメイン間アクセスのためにすべてのoriginおよびすべてのheadersをサポートし、その制限された方法は、@Requestmapping
のmethod
属性によって提供される.ソースコードを見るとわかりますが、CorsRegistry
でaddMapping()
コンフィギュレーションマッピングを使用する場合、返される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";
}
関連記事: