web-dev-qa-db-ja.com

SpringとDockerでランタイム例外をスローするとCORの問題が発生する

私は春、angularとdockerを使用してWebアプリを構築しています。今のところ2つの環境があります。angularが使用されている開発環境では、npm startとSpringを使用してmvn spring-boot:runをテストします。digitaloceanを使用してアプリをホストし、angularとSpringアプリをdockerを使用してコンテナ化します。

このアプリケーションには、ユーザーが登録できる登録ページと、登録リクエストを処理するSpring Controllerがあります。これが私のコントローラーのコードです:

@PostMapping("/register")
public SaveUserDto register(@RequestBody @Valid SaveUserDto saveUserDto, WebRequest request) {

        User userToSave = this.modelMapper.map(saveUserDto, User.class);
        User registeredUser = null;
        try {
            registeredUser = this.registrationService.register(userToSave);
        } catch (DataIntegrityViolationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(e.getRootCause().toString().contains("uk_pfki8mu6sefesty9h30d4n3yv")) {
                throw new EmailAlreadyExistException();
            }
        }
        try {
            eventPublisher.publishEvent(new OnRegistrationCompleteEvent(registeredUser, request.getLocale(), request.getHeader("Origin")));
        } catch (Exception me) {
            System.out.println(me.getMessage());
        }

        if(registeredUser != null) {
            return this.modelMapper.map(registeredUser, SaveUserDto.class);
        } else {
            return null;
        }
}

私のangularはHost:4200(Hostは私の開発環境ではlocalhsot、または私のテスト環境では165.22.72.253のいずれかです)から提供され、APIはHost:8761から提供されます。 corsリクエストを有効にするためのcors設定。設定は次のとおりです。

@Bean
public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://" + clientHost + ":4200");
        config.addAllowedOrigin("http://" + clientHost + ":80");
        config.addAllowedHeader("*");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
}

ここで、clientHostはパ​​ラメーターで、開発環境で実行する場合はlocalhostか、テスト環境の場合は165.22.72.253です。ほとんどのユースケースでは、この設定は機能していますが、特定の状況で失敗します。

この問題は、ユーザーが既存のメールアドレスで登録しようとしたときに発生します。次に、コントローラーメソッドからわかるように、EmailAlreadyExistExceptionをスローします。 dev envではすべてが正常に機能しています。つまり、要求はエラーコード500を返し、「Email already exists」というメッセージが表示されます。しかし、テスト環境ではAccess to XMLHttpRequest at 'http://165.22.72.253:8762/register' from Origin 'http://165.22.72.253:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.を取得します。

便利な場合、ここに私のdocker-composeファイルがあります:

version: "3.5"

services:

  Tomcat-file:
    container_name: Tomcat-file-server
    image: Tomcat-file-server
    build:
      context: .
      dockerfile: Tomcat-file.prod.dockerfile
    volumes:
      - /home/vetter_leo/medias:/usr/local/Tomcat/src
    ports:
      - "8205:8205"

networks:
  default:
    external:
      name: helenos-network

現時点では、テスト環境ではなく開発環境で機能している理由がわかりません。どんな助けでも大歓迎です。前もって感謝します。

6
Vetouz

たぶん、corsフィルターが呼び出される前に例外がスローされるという問題はありますか?

これを試して頂けますか?

  //...

  source.registerCorsConfiguration("/**", config);
  FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
  bean.setOrder(Ordered.HIGHEST_PRECEDENCE);

  return bean;
}
0
David