Spring Cloud - Zuul Proxy가 'Access-Control-Allow-Origin' Ajax 응답을 생성하지 않습니다.
시작 응용 프로그램:
@SpringBootApplication
@EnableZuulProxy
public class ZuulServer {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulServer.class).web(true).run(args);
}
}
내 YAML 파일은 다음과 같습니다.
server:
port:8080
spring:
application:
name: zuul
eureka:
client:
enabled: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
proxy:
route:
springapp: /springapp
저는 springapp이라는 마이크로 서비스 애플리케이션(포트 8081)을 가지고 있으며 약간의 휴식 서비스를 가지고 있습니다.다음은 클라이언트 UI 앱입니다.
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="js/libs/jquery/jquery.min.js" ></script>
</head>
<body>
<script type="text/javascript">
$.ajax({
url: 'http://localhost:8080/zuul/springapp/departments',
type: 'GET'
}).done(function (data) {
consoe.log(data);
document.write(data);
});
</script>
</body>
</html>
하지만 난...
XMLHttpRequest cannot load http://localhost:8080/zuul/springapp/departments. No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:8383' is therefore not allowed access.
이 UI HTML5 앱은 http://localhost:8383/SimpleAPP/index.html. CORS, CORS, CORS...제발 도와주세요.BTW http://localhost:8080/zuul/springapp/departments는 브라우저 주소 표시줄에 있을 때 json 목록을 반환합니다.여기 spring.io 블로그에서는 zuulproxy가 처리해주기 때문에 필터가 필요 없다고 하는데, 왜 저는 그것이 저에게 효과가 없는지 모르겠습니다.
@EnableZuulProxy로 주석이 달린 이 코드 조각을 클래스에 추가하면 효과가 있습니다.
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
저도 비슷한 문제를 겪었는데, Angular Web app이 Zuul과 Spring Security와 함께 Spring Boot에 의해 구현된 RESTful 서비스를 소비하고 있습니다.
위의 해결책이 작동하지 않았습니다.문제는 주울이 아니라 스프링 시큐리티에 있다는 것을 깨달았습니다.
공식 문서(CORS with Spring Security)에 명시된 것처럼 Spring Security를 사용할 때는 Spring Security 이전에 CORS를 구성해야 합니다.
마침내, 저는 Grinish 네팔의 솔루션(사전 답변 참조)을 효과적인 솔루션에 통합할 수 있었습니다.
다음은 스프링 보안 및 Zuul과 함께 CORS를 활성화하는 코드입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//irrelevant for this problem
@Autowired
private MyBasicAuthenticationEntryPoint authenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//configure CORS -- uses a Bean by the name of corsConfigurationSource (see method below)
//CORS must be configured prior to Spring Security
.cors().and()
//configuring security - irrelevant for this problem
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint);
//irrelevant for this problem
http.addFilterAfter(new CustomFilter(),
BasicAuthenticationFilter.class);
}
//The CORS filter bean - Configures allowed CORS any (source) to any
//(api route and method) endpoint
@Bean
CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin(CorsConfiguration.ALL);
config.addAllowedHeaders(Collections.singletonList(CorsConfiguration.ALL));
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return source;
}
//configuring BA usernames and passwords - irrelevant for this problem
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
...
}
}
응용 프로그램이 실행될 때http://localhost:8383
그러면 AJAX-통화만 할 수 있습니다.http://localhost:8383
Zuul은 그것을 바꾸지 않고 바꿀 수 없습니다.
Zuul이 할 수 있는 것은 예를 들어 요청을 매핑하는 것입니다.http://localhost:8383/zuul/
로.http://localhost:8080/zuul/
하지만 당신의 브라우저는 전화를 해야 할 것입니다.http://localhost:8383/zuul/springapp/departments
매핑을 구성해야 합니다.
구성에 다음을 추가하는 것만으로도 효과가 있었습니다.
zuul:
ignoredHeaders: Access-Control-Allow-Credentials, Access-Control-Allow-Origin
저도 같은 문제가 있었고, CorsFilter bean을 추가하여 수정했습니다.
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
그리고 이 코드에 zuul의 속성을 추가합니다.
zuul:
sensitiveHeaders:
ignored-headers: Access-Control-Allow-Credentials, Access-Control-Allow-Origin
문제에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
그것은 브라우저가 사용자가 공통 출처 정책을 위반했다고 알려주는 것일 뿐입니다(위키백과 항목 및 인터넷에 있는 방대한 양의 자료를 참조하십시오. 이 중 어느 것도 추가한 태그와 실제로 관련이 없습니다.)CORS 비행 전 점검을 서비스하여 다른 주소에서 리소스를 로드해도 괜찮다는 것을 브라우저에 알려줄 수 있습니다(예:Filter
하기 쉽습니다 또는 프록시를 통해 HTML을 로드합니다(힌트: 후자가 훨씬 쉽고 오류가 발생하기 쉽습니다).
다음과 같은 경우에도 여전히 문제가 있는 사람들을 위해.@Bean CorsFilter
에 "되었습다니추"라는 합니다. 컨트롤러에 주석이 달렸는지 확인하십시오.@CrossOrigin
컨트롤러 레벨과 Zuul 프록시에서 이러한 CORS 복제가 문제의 원인일 수 있습니다.
언급URL : https://stackoverflow.com/questions/28670640/spring-cloud-zuul-proxy-is-producing-a-no-access-control-allow-origin-ajax-r
'programing' 카테고리의 다른 글
컨트롤러 레벨에서 사용자 지정 예외 및 처리를 발생시키지 않고 서비스 계층에서 ResponseStatusException을 직접 발생시킬 수 있습니까? (0) | 2023.07.20 |
---|---|
ODBC 관리자가 Oracle TNS 이름 파일을 찾을 수 없음 (0) | 2023.07.20 |
포맷 후 NUMBER 열에 ####이 표시되는 이유는 무엇입니까? (0) | 2023.07.20 |
PIL로 이미지를 저장하려면 어떻게 해야 합니까? (0) | 2023.07.20 |
파이썬에서 포인트가 폴리곤 내부에 있는지 확인하는 가장 빠른 방법은 무엇입니까? (0) | 2023.07.20 |