この記事では SpringBoot クロスドメインの概要 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。
前書き: 何らかの理由で、同社の SpringBoot プロジェクトはクロスドメイン リクエストを処理することがよくあります。 ######1つ。以前、関連情報を参考にクロスドメイン処理を扱うクラスを以下のように書きました。
1.1 最初にフィルターを定義します (クロスドメインリクエストを含むすべてのリクエストのインターセプト)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class CrossDomainFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) request;
HttpServletResponse hresp = (HttpServletResponse) response;
hresp.setHeader( "Access-Control-Allow-Origin" , "*" );
hresp.setHeader( "Access-Control-Allow-Methods" , "*" );
hresp.setHeader( "Access-Control-Allow-Headers" , "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,x-requested-with,requesttype" );
if (hreq.getMethod().equals( "OPTIONS" )) {
hresp.setStatus(200);
hresp.getWriter().write( "OPTIONS returns OK" );
return ;
}
chain.doFilter(request, response);
}
}
|
ログイン後にコピー
1.2 構成クラスを登録します (構成)上記で定義されたフィルター クラスはコンテキスト環境に登録されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Configuration
public class WebConfiguration {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}
@Bean
public FilterRegistrationBean<CrossDomainFilter> testFilterRegistration() {
FilterRegistrationBean<CrossDomainFilter> registration = new FilterRegistrationBean<CrossDomainFilter>();
registration.setFilter( new CrossDomainFilter());
registration.addUrlPatterns( "/*" );
registration.addInitParameter( "paramName" , "paramValue" );
registration.setName( "MyFilter" );
registration.setOrder(1);
return registration;
}
}
|
ログイン後にコピー
注: この構成クラスは主に、フィルター (CrossDomainFilter) によるリクエストのインターセプトの問題を解決します。 )
2. クロスドメイン フィルター (CorsFilter) に対する SpringBoot 独自のソリューションは非常に単純です。このメソッドはクラスの doFilterInternal() メソッドを直接表示できます。 doFilter() メソッドで呼び出されます (Filter の doFilter() メソッドであると理解できます)。
処理プロセスも OPTION メソッドを受け入れ、200 を応答してリターンします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Configuration
@EnableAutoConfiguration
public class CrossOriginconfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin( "*" );
corsConfiguration.addAllowedHeader( "*" );
corsConfiguration.addAllowedMethod( "*" );
urlBasedCorsConfigurationSource.registerCorsConfiguration( "/**" , corsConfiguration);
System.out.println( "confi init" );
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
|
ログイン後にコピー
3: クロスドメインの問題に関する個人的なまとめ
ブラウザは、リクエストを送信する前に、そして送信する前に、まずクロスドメインの問題を検出します。クロスドメイン要求の場合、タイプ OPTIONS の要求が送信されます (要求アドレスは変更されず、要求ヘッダーには他の情報が含まれます)。要求はサーバーによって応答される必要があります (要求が応答しない場合は、CrossDomainFilter を確認してください)。応答を受信しても、ブラウザは実際のリクエストを送信しません。
3.1: ブラウザによって送信される OPTION リクエスト (暫定リクエスト)

注: この図では、リクエスト アドレスが変更されていないことがわかります。 () 、リクエスト メソッドは OPTION であり、リクエスト ヘッダーにはいくつかの情報が含まれています。この情報は、クロスドメイン リクエストを行っており、リクエスト メソッドが POST であることを示している可能性があります。 。
3.2: サーバーはリクエストに応答する必要があります (CrossDomainFilter を確認してください)
1) まず、対応するヘッダーを設定します (サポートしているクロスドメイン リクエストに関する情報をブラウザーに伝えます)。
2) 対応するステータスを 200 に設定し、データ (任意のデータ) を返します。
3.3: ブラウザは OPTION リクエストに対する応答を取得しました (サーバーはクロスドメインを受け入れます)。次のように実際のリクエストを送信してください。
#1) OPTION リクエストを比較します。リクエスト アドレスは変更されていません^_^
2) 比較してください。リクエストメソッド、リクエストは POST であり、POST リクエストは OPTIN にあります (Access-Control-Request-Method)。
3) OPTION リクエストのヘッダーを比較すると、このリクエストには Access-Control-Allow-**** 関連のパラメーターがありません。
以上がSpringBoot クロスドメインの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。