Spring Cloud 프로젝트 전후 단 분리 크로스 오 버 작업
일반적인 상황 에 대해 사실 바 이 두 위의 방안 은 모두 실행 가능 하 다.
저 는 주로 두 가지 상황 을 소개 합 니 다.
물론 제 가 있 는 이곳 의 설정 은 모두 게 이 트 웨 이 를 기반 으로 하 는 것 이지 서비스 에 기반 한 것 이 아 닙 니 다.
1.권한 검증 을 추가 하지 않 았 습 니 다.
2.spring security 권한 검증 추가(keyCloak 기반),Authorization 추가
우선 첫 번 째 상황 의 해결 방법 을 소개 합 니 다.이것 은 간단 합 니 다.시작 클래스 에 필 터 를 설정 하면 해결 할 수 있 습 니 다.
@Bean
public CorsFilter corsFilter() {
//1. CORS
CorsConfiguration config = new CorsConfiguration();
//
config.addAllowedOrigin("*");
// Cookie
config.setAllowCredentials(true);
// ( )
config.addAllowedMethod("*");
// ( )
config.addAllowedHeader("*");
// ( )
config.addExposedHeader("*");
//2.
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3. CorsFilter.
return new CorsFilter(configSource);
}
제 가 상황 을 만 나 는 것 이 두 번 째 입 니 다.이런 상황 에서 위의 방식 은 거의 효과 가 없습니다.저 는 키 클 락 이 하 는 권한 검증 을 사용 합 니 다.우선 필터 설정 추가:
@Component
public class CorsControllerFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletResponse res = (HttpServletResponse) response;
res.setContentType("text/html;charset=UTF-8");
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE ,PUT");
res.setHeader("Access-Control-Max-Age", "3600");
res.setHeader("Access-Control-Allow-Headers", "*");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("XDomainRequestAllowed", "1");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
시작 클래스 에 설정 추가
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
CorsControllerFilter corsControllerFilter = new CorsControllerFilter();
registrationBean.setFilter(corsControllerFilter);
return registrationBean;
}
그러나 일부 요청 에 대해 서 는 OPTIONS 요청 을 먼저 요청 해 권한 검증 에 실 패 했 습 니 다.따라서 차단기 설정 을 추가 하고 모든 OPTIONS 요청 을 직접 실행 시 켜 200 상 태 를 되 돌려 줍 니 다.
public class OptionsInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
if(request.getMethod().equals("OPTIONS")){
response.setStatus(HttpServletResponse.SC_OK);
return false;
}
return true;
}
}
웹 프로필 을 설정 하고 차단 기 를 불 러 옵 니 다.
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OptionsInterceptor()).addPathPatterns("/**");
}
}
이렇게 설정 하면 될 줄 알 았 는데 요청 할 때 OPTIONS 의 요청 이 크로스 필드 문 제 를 보고 하고 차단 기 를 추가 하여 크로스 필드 설정 을 허용 합 니 다.
public class CrossInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Max-Age", "3600");
return true;
}
}
WebMvcConfiguration 에 설정 을 추가 합 니 다.Options Interceptor 앞 에 쓰 십시오.
registry.addInterceptor(new CrossInterceptor()).addPathPatterns("/**");
계속 테스트 하여 도 메 인 문 제 를 해결 합 니 다.원리 에 대해 저도 잘 모 르 겠 습 니 다.여러분 의 의사 소통 을 환영 합 니 다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.