>Java >java지도 시간 >CORS 도메인 간 요청을 구현하는 Java의 분석 예

CORS 도메인 간 요청을 구현하는 Java의 분석 예

黄舟
黄舟원래의
2017-09-23 09:44:221561검색

이 글은 주로 Java에서의 CORS 크로스 도메인 요청 구현 방법을 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 이를 여러분과 공유하고 참고용으로 제공하겠습니다. 에디터 따라가서 함께 살펴볼까요

문제

프론트엔드와 백엔드 분리 모드를 사용하여 프로젝트를 개발하다 보면 도메인을 넘어 서버 데이터를 얻을 수 없는 이런 문제가 자주 발생합니다

이것은 브라우저의 출처가 동일하기 때문에 발생하는 정책이며 보안을 위한 목적입니다. 오늘날 프런트엔드와 백엔드 분리 개발 모델이 널리 보급되면 프런트엔드와 백엔드 프로젝트가 서로 다른 환경에서 개발되는 경우가 많아 도메인 전반에 걸쳐 데이터를 요청해야 하는 경우가 많습니다. 솔루션에는 주로 다음이 포함됩니다:

JSONP, iframe, 프록시 모드, CORS 등.
이전 방법은 여기서 논의되지 않으며 인터넷에 많은 정보가 있습니다. 여기서는 주로 CORS 솔루션을 공유하겠습니다. CORS는 "교차 도메인 리소스 공유"를 의미합니다. 이를 통해 브라우저는 교차 원본 서버에 XMLHttpRequest 요청을 발행할 수 있으므로 AJAX가 동일한 소스에서만 사용될 수 있다는 제한을 극복할 수 있습니다.

CORS 크로스 도메인을 사용하는 프로세스는 일반적인 Ajax 프로세스와 동일합니다. 단, 서버가 지원을 제공하는 한 이것이 크로스 도메인 요청임을 발견하면 브라우저가 자동으로 몇 가지 작업을 처리한다는 점만 다릅니다. , 프런트엔드는 필요하지 않습니다. 추가 작업을 수행합니다.

implementation

구현의 일반적인 아이디어는 다음과 같습니다. 먼저 필터를 사용하여 Origin 필드(프로토콜을 포함하여 요청이 어떤 소스에서 왔는지 나타냄)와 같은 요청 개체의 정보를 얻습니다. , 도메인 이름, 포트)을 검토하고 사전 구성된 매개변수를 통해 요청이 합법적인지 확인한 후 응답 개체의 헤더 정보를 설정하여 도메인 간 리소스 요청을 구현합니다. 구현 방법을 소개하기에 앞서, 먼저 사용될 응답 헤더 정보에 대해 알아보겠습니다.

응답 헤더

Access-Control-Allow-Methods
는 브라우저의 CORS 요청에서 허용되는 HTTP 메서드(예: GET, POST, PUT, DELETE, OPTIONS

Access-Control-Allow-)를 나열하는 데 사용됩니다. 자격 증명
교차 도메인 쿠키가 지원되는지 여부를 나타냅니다.

Access-Control-Allow-Headers
Content-Type 및 사용자 정의 필드와 같이 서버에서 지원하는 모든 헤더 정보 필드를 나타내는 쉼표로 구분된 문자열

Access-Control-Expose - Headers
는 "Access-Control-Allow-Headers"의 반대이며 지원되지 않는 헤더 정보 필드를 나타냅니다.

Access-Control-Allow-Origin
은 프로토콜, 도메인 이름 및 포트를 포함한 도메인 간 요청 소스 정보를 허용합니다. 권한을 나타냅니다. 모든 요청 소스, 단 하나의 요청 소스만 설정할 수 있습니다

다음은 Java 백그라운드에서 이 메서드를 구현하는 방법에 대한 소개입니다.

Code

저는 최근 spring-boot를 사용해왔기 때문에 spring-boot 기반으로 구현해보겠습니다.

먼저 CorsFilter 필터를 만듭니다. 코드는 다음과 같습니다.


...
@WebFilter(filterName = "corsFilter", urlPatterns = "/*",
    initParams = {@WebInitParam(name = "allowOrigin", value = "*"),
        @WebInitParam(name = "allowMethods", value = "GET,POST,PUT,DELETE,OPTIONS"),
        @WebInitParam(name = "allowCredentials", value = "true"),
        @WebInitParam(name = "allowHeaders", value = "Content-Type,X-Token")})
public class CorsFilter implements Filter {

  private String allowOrigin;
  private String allowMethods;
  private String allowCredentials;
  private String allowHeaders;
  private String exposeHeaders;

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    allowOrigin = filterConfig.getInitParameter("allowOrigin");
    allowMethods = filterConfig.getInitParameter("allowMethods");
    allowCredentials = filterConfig.getInitParameter("allowCredentials");
    allowHeaders = filterConfig.getInitParameter("allowHeaders");
    exposeHeaders = filterConfig.getInitParameter("exposeHeaders");
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    if (!StringUtils.isEmpty(allowOrigin)) {
      if(allowOrigin.equals("*")){
        response.setHeader("Access-Control-Allow-Origin", allowOrigin);
      }else{
        List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));
        if (allowOriginList != null && allowOriginList.size() > 0) {
          String currentOrigin = request.getHeader("Origin");
          if (allowOriginList.contains(currentOrigin)) {
            response.setHeader("Access-Control-Allow-Origin", currentOrigin);
          }
        }
      }
    }
    if (!StringUtils.isEmpty(allowMethods)) {
      response.setHeader("Access-Control-Allow-Methods", allowMethods);
    }
    if (!StringUtils.isEmpty(allowCredentials)) {
      response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
    }
    if (!StringUtils.isEmpty(allowHeaders)) {
      response.setHeader("Access-Control-Allow-Headers", allowHeaders);
    }
    if (!StringUtils.isEmpty(exposeHeaders)) {
      response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
    }
    filterChain.doFilter(servletRequest, servletResponse);
  }

  @Override
  public void destroy() {

  }
}

이제 프런트 엔드는 다른 방법보다 훨씬 쉽습니다. 간단하고 이해하기 쉽습니다. 다른 백엔드 개발 방법도 마찬가지입니다. 최종 목표는 요청을 판단하고 응답 헤더를 설정하는 것입니다.

위 내용은 CORS 도메인 간 요청을 구현하는 Java의 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.