新しいクロスドメインのリソースへのアクセス(クロスオリジンリソースの共有)でHTML 5の特徴は、私たちは、バックエンドシステムの開発にクロスドメインアクセスのリソースを許可するかどうかを決定することができます。いわゆるクロスドメインは、異なるドメイン名、または別のポートまたはそのような問題ドメイン交差するmrbrid.cc mrbird.cc:8080ウェブサイトのサイトからリソースにアクセスするときのように異なるプロトコルを指します。箱から出してクロスドメインのサポートを提供するために、最初から春の4.2バージョン。ここでは春ブーツ開発のクロスドメインの問題を解決する方法だし、インタフェースは、アノテーション駆動型のプログラミングに分かれています。
クロスドメインシミュレーション
クロスドメインの問題を解決するために、我々は最初のクロスドメインのシナリオをシミュレートする必要があります。新しい春のブートプロジェクト、バージョン2.1.0.RELEASE、および以下の依存を引用:
<依存性>
<のgroupId> org.springframework.boot </のgroupId>
<たartifactId>ばねブートスタータウェブ</たartifactId>
</依存>
<依存性>
<のgroupId> org.springframework.boot </のgroupId>
<たartifactId >春・ブート・スタータthymeleaf </たartifactId>
</依存関係>
次のようにアイテムの構造は次のとおりです。
でcom.example.demo 下に新しいパスコントローラパッケージと作成TestController :
@Controller
パブリッククラスTestController { @RequestMapping(「インデックス」) パブリック文字列インデックス(){ 戻り「インデックス」。 } @RequestMapping( "ハロー") @ResponseBody パブリック文字列のHello(){ 戻り"ハロー"。 } }
リソース/テンプレートの下に、新しいindex.htmlを:
<!DOCTYPE HTML>
<HTML LANG = "EN">
<HEAD>
<メタ文字コード= "UTF-8">
<タイトル>跨域测试</ TITLE>
<スクリプトSRC = "http://libs.baidu.com /jquery/1.11.3/jquery.min.js "> </ SCRIPT>
</ head>
<body>
<DIV ID ="こんにちは"> </ div>
</ body>
<script>
$(関数(){
$に.get( "http://test.mrbird.cc:8080/hello"機能(データ){
$( "#ハロー")テキスト(データ);
})
})
</ SCRIPT>
</ HTML>
ローカルhostsファイル、編集http://test.mrbird.cc:127.0.0.1のアドレスにマッピングします
起動項目が訪問HTTPを:// localhostを:8080 / 、その間違った報告書を見つけるのブラウザコンソールを観察するために、正常ハロー表示されないページ、およびF12を見つけます:
これは、私たちのhttp:8080 /://ローカルホストのドメイン名の試みhttp://test.mrbird.cc:8080クロスドメインの問題は、我々はこの問題を解決する必要がこんにちはインタフェース、。
注釈主導
スプリング4.2提供@CrossOrigin 、注釈はメソッドまたはクラスにマークすることができる、注釈を以下の属性を含みます。
プロパティ | 意味 |
---|---|
値 | サポートされているドメインのセットを指定した* すべてのドメインは、デフォルト値をサポートしていることを示します* 。これらの値は、HTTPリクエストヘッダに対応しますAccess-Control-Allow-Origin |
起源 | 同値 |
allowedHeaders | リクエストヘッダのヘッダを許可する、デフォルトのサポート |
exposedHeaders | レスポンスヘッダにヘッドへのアクセスを許可する、デフォルトは空です |
方法 | 以下のような要求をサポートする方法であって、GET 、POST 、PUT 等が挙げられ、コントローラのメソッドのデフォルトのラベルと一致しています。 |
allowCredentials | 使用する際に特定のドメインを指定する必要があり、要求とともに送信されたクッキーを許可します |
MAXAGE | 要求の妥当性の事前結果、デフォルトで30分 |
我々は、変換する必要があるメソッドを:TestController
hello
( "こんにちは")@RequestMapping
@ResponseBody
@CrossOrigin(値= "*")
パブリック文字列のHello(){
戻り"ハロー"。
}
許可すべてのフィールドがサポートされ、再び訪問し、プロジェクトを再起動してHTTPを:// localhostを:8080 / :
プログラミングインタフェース
使用に加えて@CrossOrigin
、注釈を、我々は統一プログラミングを設定するインターフェイスを使用することができます。
でcom.example.demo
新しいパスケースconfig
パッケージ、その後、作成WebConfigurer
、実装WebMvcConfigurer
、オーバーライドするaddCorsMappings
デフォルトの実装を:
@Configuration
パブリッククラスWebConfigurerはWebMvcConfigurer {実装 @Override ます。public void addCorsMappings(CorsRegistryレジストリ){ registry.addMapping( "/ **") .allowedOrigins( "*") ("GET").allowedMethodsを。 } }
上面配置表示允许所有请求支持跨域访问,并且不限定域,但是支持持GET方法。将hello
方法上的@CrossOrigin
注解注释掉,重启项目,再次访问http://localhost:8080/,结果也是OK的。
过滤器实现
查看官方文档,发现其还提供了基于过滤器的实现方式:
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
Actuator跨域
如果项目里集成了Actuator
相关功能,其暴露的接口也支持跨域,只需要在配置文件中添加如下配置即可:
ENDPOINTS CORS CONFIGURATION (CorsEndpointProperties)
management.endpoints.web.cors.allow-credentials= # Whether credentials are supported. When not set, credentials are not supported.
management.endpoints.web.cors.allowed-headers= # Comma-separated list of headers to allow in a request. '*' allows all headers.
management.endpoints.web.cors.allowed-methods= # Comma-separated list of methods to allow. '*' allows all methods. When not set, defaults to GET.
management.endpoints.web.cors.allowed-origins= # Comma-separated list of origins to allow. '*' allows all origins. When not set, CORS support is disabled.
management.endpoints.web.cors.exposed-headers= # Comma-separated list of headers to include in a response.
management.endpoints.web.cors.max-age=1800s # How long the response from a pre-flight request can be cached by clients. If a duration suffix is not specified, seconds will be used.