ホームページ  >  記事  >  Java  >  Spring Boot がクロスドメイン実装を実装する方法は何ですか?

Spring Boot がクロスドメイン実装を実装する方法は何ですか?

WBOY
WBOY転載
2023-05-18 10:10:261360ブラウズ

1. クロスドメインの問題が発生する理由

これは、ブラウザーの同一生成元ポリシーの制限が原因です。同一生成元ポリシー (同一生成元ポリシー) は規約です。これはブラウザの中核で最も基本的なセキュリティ機能です。同一生成元ポリシーが存在しない場合、ブラウザの通常の機能に影響が出る可能性があります。 Web は同一生成元ポリシーに基づいて構築されており、ブラウザは同一生成元ポリシーを実装する手段にすぎません。

JavaScript では、同一生成元ポリシーにより、異なるドメイン間のやり取りが制限され、クロスドメイン攻撃が防止されます。いわゆる同じオリジン (つまり、同じドメイン内) とは、2 つのページが同じプロトコル、ホスト、ポート

2 を持っていることを意味します。リクエスト URL のプロトコル、ドメイン名、ポートが現在のページ URL と異なり、クロスドメインです。

Spring Boot がクロスドメイン実装を実装する方法は何ですか?

3. 独自の制限以外の制限

    #非同種 Web ページの Cookie、LocalStorage、および IndexedDB を読み取ることができません
  1. 非同種 Web ページの DOM にアクセスできません
  2. AJAX リクエストを元のアドレス以外に送信できない
  3. 4. Java バックエンドが CORS クロスドメイン リクエストを実装する方法

CORS の場合クロスドメイン リクエスト。主に次の方法から選択できます:

    新しい CorsFilter を返す
  1. WebMvcConfigurer を書き換える
  2. アノテーション @CrossOrigin を使用します
  3. 応答ヘッダー (HttpServletResponse) を手動で設定します
  4. ##クロスドメインを実現するために Web フィルターをカスタマイズします
  5. 注:

CorFilter / WebMvConfigurer / @CrossOrigin をサポートするには、SpringBoot バージョン 1.3 以降に対応する SpringMVC バージョン 4.2 以降が必要です
  • 最初の 2 つの方法はグローバル CORS 構成であり、後の 2 つの方法はローカル CORS 構成です。ローカル クロスドメインを使用すると、グローバル クロスドメイン ルールがオーバーライドされるため、@CrossOrigin アノテーションを使用して、より詳細なクロスドメイン リソース制御を行うことができます。
  • 実際、どのソリューションであっても、最終的な目標は、応答ヘッダーを変更し、ブラウザーが必要とするデータを応答ヘッダーに追加して、クロスドメイン ## を達成することです。
  • #1. 新しい CorsFilter (グローバル クロスドメイン) を返す

  • 任意の構成クラスで、新しい CorsFIlter Bean を返し、マッピング パスと特定の CORS 構成パスを追加します。
@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

2. WebMvcConfigurer をオーバーライド (グローバル クロスドメイン)

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

3. アノテーションを使用する (ローカル クロスドメイン)

Use annotations@ コントローラー (クラス) CrossOrigin :、このクラスのすべてのメソッドがクロスドメインを許可することを示します。

@RestController
@CrossOrigin(origins = "*")
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

メソッドでアノテーション @CrossOrigin を使用します:

@RequestMapping("/hello")
    @CrossOrigin(origins = "*")
     //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
    public String hello() {
        return "hello world";
    }

4. 応答ヘッダーを手動で設定します (ローカル クロスドメイン)

HttpServletResponse オブジェクトを使用して応答を追加しますヘッダー (Access-Control-Allow-Origin) を使用して、元のドメインを承認します。ここでの Origin の値は、すべてのアクセス許可が許可されていることを示す「*」に設定することもできます。

@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}

5. カスタム フィルターを使用してクロスドメインを実現する

まず、MyCorsFilter.javaという名前のフィルターを作成します

package com.mesnac.aop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyCorsFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}

このフィルターを web.xml デバイスで構成します効果的なものにするために

<!-- 跨域访问 START-->
<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>com.mesnac.aop.MyCorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 跨域访问 END  -->

以上がSpring Boot がクロスドメイン実装を実装する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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