gpt4 book ai didi

angular - 使用 spring 和 docker 抛出运行时异常时的 cors 问题

转载 作者:行者123 更新时间:2023-12-02 17:46:05 24 4
gpt4 key购买 nike

我使用 spring、angular 和 docker 构建了一个 web 应用程序。我目前也有两个环境。使用 npm start 提供 angular 的开发环境和 Spring 使用 mvn spring-boot:run .以及我使用 digitalocean 托管我的应用程序并使用 docker 容器化 angular 和 spring 应用程序的测试环境。

在这个应用程序中,我有一个用户可以注册的注册页面和一个 Spring Controller 来处理注册请求。这是我的 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 。对于大多数用例,此设置有效,但在特定情况下会失败。

当用户尝试使用现有电子邮件地址进行注册时,就会出现问题。然后正如您从 Controller 方法中看到的那样,我抛出了一个 EmailAlreadyExistException。在 dev env 中,一切都运行良好,即请求返回错误代码 500,并显示消息“电子邮件已经存在”。但是在测试环境我得到 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

在这一点上,我不明白为什么它在 dev env 中而不是在 test env 中工作。任何帮助将不胜感激。提前致谢。

最佳答案

我最终要做的是向 Controller 中的异常添加一个处理程序,它会返回正确的消息:这样:

@ExceptionHandler({ EmailAlreadyExistException.class })
public String handleException() {
return "{\"error\": \"" + messages.getMessage("emailAlreadyExist", null, Locale.ENGLISH) + "\"}";
}

关于angular - 使用 spring 和 docker 抛出运行时异常时的 cors 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61044111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com