ホームページ  >  記事  >  Java  >  SpringBoot クロスドメインの概要 (コード例)

SpringBoot クロスドメインの概要 (コード例)

不言
不言転載
2019-02-22 13:12:163304ブラウズ

この記事では SpringBoot クロスドメインの概要 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

前書き: 何らかの理由で、同社の SpringBoot プロジェクトはクロスドメイン リクエストを処理することがよくあります。 ######1つ。以前、関連情報を参考にクロスドメイン処理を扱うクラスを以下のように書きました。

1.1 最初にフィルターを定義します (クロスドメインリクエストを含むすべてのリクエストのインターセプト)

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", "*");  //设置相应头
        //跨域 Header
        hresp.setHeader("Access-Control-Allow-Methods", "*");
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,x-requested-with,requesttype");
        //header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype');
        // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
        // 配置options的请求返回
        if (hreq.getMethod().equals("OPTIONS")) {  //如果发现该请求为OPTION,则直接返回(不需要进入系统),并且设置相应信息
            hresp.setStatus(200);
            // hresp.setContentLength(0);
            hresp.getWriter().write("OPTIONS returns OK");
            return;
        }
        // Filter 只是链式处理,请求依然转发到目的地址。
        chain.doFilter(request, response);
    }
}

1.2 構成クラスを登録します (構成)上記で定義されたフィルター クラスはコンテキスト環境に登録されます。

@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 を応答してリターンします。

@Configuration
@EnableAutoConfiguration
public class CrossOriginconfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 设置你要允许的网站域名,如果全允许则设为 *
        corsConfiguration.addAllowedOrigin("*");
        // 如果要限制 HEADER 或 METHOD 请自行更改
        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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。