[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.최근에이 문제에 직면 해이 솔루션을 발견했습니다. 필터를 사용하여 다음 헤더를 추가 할 수 있습니다.
최근에이 문제에 직면 해이 솔루션을 발견했습니다. 필터를 사용하여 다음 헤더를 추가 할 수 있습니다.
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.업데이트! 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.컨트롤러의 헤더를 설정하려면 @ModelAttribute 주석을 사용할 수 있습니다.
컨트롤러의 헤더를 설정하려면 @ModelAttribute 주석을 사용할 수 있습니다.
@ModelAttribute public void setVaryResponseHeader(HttpServletResponse response) { response.setHeader("Vary", "Accept"); }
-
==============================
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.WebContentInterceptor에는 Access-Control-Allow-Origin이라는 속성이 없으며 볼 수있는 한 응답 헤더를 설정하는 메소드가 없습니다. 일부 속성을 활성화 / 비활성화하여 캐시 관련 헤더 만 설정합니다. 그러나이를 수행하는 자체 인터셉터 (또는 서블릿 필터)를 작성하는 것은 쉽지 않습니다.
WebContentInterceptor에는 Access-Control-Allow-Origin이라는 속성이 없으며 볼 수있는 한 응답 헤더를 설정하는 메소드가 없습니다. 일부 속성을 활성화 / 비활성화하여 캐시 관련 헤더 만 설정합니다. 그러나이를 수행하는 자체 인터셉터 (또는 서블릿 필터)를 작성하는 것은 쉽지 않습니다.
-
==============================
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; }
from https://stackoverflow.com/questions/16190699/automatically-add-header-to-every-response by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 MVC 컨트롤러에 대한 GET 요청에서 날짜 매개 변수를 수락하는 방법? (0) | 2018.12.08 |
---|---|
[SPRING] Spring 보안 3.2 다중 요청에 대한 CSRF 지원 (0) | 2018.12.08 |
[SPRING] <mvc : annotation-driven />를 제거하는 방법? (0) | 2018.12.08 |
[SPRING] Spring Rest Template + Spring Web MVC를 이용한 다중 파일 업로드 (0) | 2018.12.08 |
[SPRING] 스프링 부트 액츄에이터 응용 프로그램이 Ubuntu VPS에서 시작되지 않습니다. (0) | 2018.12.08 |