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("/**");
계속 테스트 하여 도 메 인 문 제 를 해결 합 니 다.원리 에 대해 저도 잘 모 르 겠 습 니 다.여러분 의 의사 소통 을 환영 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기