복붙노트

[SPRING] 모든 응답에 헤더를 자동으로 추가합니다.

SPRING

모든 응답에 헤더를 자동으로 추가합니다.

이 헤더를 "Access-Control-Allow-Origin", "*"를 원할 때마다 클라이언트에 대한 모든 응답에 추가합니다. 원점 공유 리소스 공유를 허용하려면 내 컨트롤러의 요청이있을 때마다 현재 수동으로 추가하고 있습니다. 헤더를 각각의 모든 메소드에

HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*");

그것의 작동하지만 매우 좌절. 우리는 각 응답에서 헤더를 수정할 수있는 스프링 문서에서 webContentInterceptor를 발견했습니다.

<mvc:interceptors>
<bean id="webContentInterceptor" 
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="Access-Control-Allow-Origin" value="*"/>
</bean>
</mvc:interceptors>

하지만 이걸 사용하면 이름이 Access-Control-Allow-Origin이라는 속성을 찾을 수 없다는 오류가 발생하므로 모든 응답에 헤더를 자동으로 추가 할 수있는 다른 방법이 있습니다.

업데이트! Spring 프레임 워크 4.2는 메소드 나 컨트롤러 자체에 @CrossOrigin 주석을 추가하여이를 매우 단순화합니다. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

해결법

  1. ==============================

    1.최근에이 문제에 직면 해이 솔루션을 발견했습니다. 필터를 사용하여 다음 헤더를 추가 할 수 있습니다.

    최근에이 문제에 직면 해이 솔루션을 발견했습니다. 필터를 사용하여 다음 헤더를 추가 할 수 있습니다.

    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    public class CorsFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {
                response.addHeader("Access-Control-Allow-Origin", "*");
                if (request.getHeader("Access-Control-Request-Method") != null
                        && "OPTIONS".equals(request.getMethod())) {
                    // CORS "pre-flight" request
                    response.addHeader("Access-Control-Allow-Methods",
                            "GET, POST, PUT, DELETE");
                    response.addHeader("Access-Control-Allow-Headers",
                            "X-Requested-With,Origin,Content-Type, Accept");
                }
                filterChain.doFilter(request, response);
        }
    
    }
    

    스프링 컨텍스트에 필터를 추가하는 것을 잊지 마십시오.

    <bean id="corsFilter" class="my.package.CorsFilter" />
    

    및 web.xml의 매핑 :

    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    조금 더 나아가려면 Spring 프로파일을 지정하여 다음과 같이이 필터를 활성화 또는 비활성화 할 수 있습니다.

    <beans profile="!cors">
        <bean id="corsFilter" class="my.package.FilterChainDoFilter" />
    </beans>
    
    <beans profile="cors">
        <bean id="corsFilter" class="my.package.CorsFilter" />
    </beans>
    

    (CorsFilter와 비슷한 FilterChainDoFilter를 제공하지만 doFilterInternal (..)에서는 filterChain.doFilter (request, response) 만 수행함)

  2. ==============================

    2.업데이트! Spring 프레임 워크 4.2는 메소드 나 컨트롤러 자체에 @CrossOrigin 주석을 추가하여이를 단순화합니다. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

    업데이트! Spring 프레임 워크 4.2는 메소드 나 컨트롤러 자체에 @CrossOrigin 주석을 추가하여이를 단순화합니다. https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

  3. ==============================

    3.컨트롤러의 헤더를 설정하려면 @ModelAttribute 주석을 사용할 수 있습니다.

    컨트롤러의 헤더를 설정하려면 @ModelAttribute 주석을 사용할 수 있습니다.

    @ModelAttribute
    public void setVaryResponseHeader(HttpServletResponse response) {
        response.setHeader("Vary", "Accept");
    }    
    
  4. ==============================

    4.Spring 4에서는 @CrossOrigin ()을 사용할 수 있습니다. 당신에게 교차 출처 문제를 허용합니다.

    Spring 4에서는 @CrossOrigin ()을 사용할 수 있습니다. 당신에게 교차 출처 문제를 허용합니다.

    보안상의 이유로 브라우저는 현재 출처 외부에있는 리소스에 대한 AJAX 호출을 금지합니다. 예를 들어 한 탭에서 은행 계좌를 확인할 때 다른 탭에있는 evil.com 웹 사이트를 사용할 수 있습니다. evil.com의 스크립트는 사용자의 자격 증명을 사용하여 은행 API에 AJAX 요청 (계정에서 금액 인출)을 할 수 없어야합니다.

    Cross-Origin Resource Sharing (CORS)은 대부분의 브라우저에서 구현되는 W3C 사양으로, IFrame 또는 JSONP와 같이 덜 안전하고 강력하지 않은 해킹 대신에 어떤 종류의 상호 도메인 요청을 유연하게 지정할 수 있습니다.

    Spring Framework 4.2 GA는 CORS를 즉시 사용할 수 있도록 지원하므로 일반적인 필터 기반 솔루션보다 쉽고 강력한 방법으로 구성 할 수 있습니다.

    CORS를 활성화하기 위해 @RequestMapping 주석 처리기 메소드에 @CrossOrigin 주석을 추가 할 수 있습니다. 기본적으로 @CrossOrigin은 @RequestMapping 주석에 지정된 모든 출처와 HTTP 메서드를 허용합니다.

    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
        @CrossOrigin
        @RequestMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }
    
        @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }
    

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

    https://spring.io/guides/gs/rest-service-cors/

    https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

  5. ==============================

    5.WebContentInterceptor에는 Access-Control-Allow-Origin이라는 속성이 없으며 볼 수있는 한 응답 헤더를 설정하는 메소드가 없습니다. 일부 속성을 활성화 / 비활성화하여 캐시 관련 헤더 만 설정합니다. 그러나이를 수행하는 자체 인터셉터 (또는 서블릿 필터)를 작성하는 것은 쉽지 않습니다.

    WebContentInterceptor에는 Access-Control-Allow-Origin이라는 속성이 없으며 볼 수있는 한 응답 헤더를 설정하는 메소드가 없습니다. 일부 속성을 활성화 / 비활성화하여 캐시 관련 헤더 만 설정합니다. 그러나이를 수행하는 자체 인터셉터 (또는 서블릿 필터)를 작성하는 것은 쉽지 않습니다.

  6. ==============================

    6.나는 또한이 문제에 직면하고있다. 나는이 코드 문제를 해결했다.

    나는 또한이 문제에 직면하고있다. 나는이 코드 문제를 해결했다.

    public static HttpServletResponse getResponse(HttpServletResponse response) {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        return response;
    }
    
  7. from https://stackoverflow.com/questions/16190699/automatically-add-header-to-every-response by cc-by-sa and MIT license