[SPRING] 교차 원산지 요청 차단 된 Spring REST 서비스 + AJAX
SPRING교차 원산지 요청 차단 된 Spring REST 서비스 + AJAX
봄 REST 서비스를 호출 할 수 없습니다.
나의 봄 서비스
@RequestMapping(value = "/MAS/authenticate", method = RequestMethod.POST)
public ResponseEntity<Map<String, String>> authenticate(@RequestBody Subject subject) {
Map<String, String> result = new HashMap<String, String>();
result.put("result_detail", "Invalid Password");
result.put("result", "failure");
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
return new ResponseEntity<Map<String, String>>(result, responseHeaders, HttpStatus.OK);
}
내 AJAX 코드
$.ajax(
{
crossDomain: true,
type: "POST",
contentType: "application/json; charset=utf-8",
async: false,
url: "http://localhost:8080/SpringMVC/rest/MAS/authenticate",
headers: {"Access-Control-Allow-Origin" : "*"},
data:{},
dataType: "json", //also tried "jsonp"
success: function(data, status, jqXHR)
{
alert('success');
},
error: function(jqXHR, status)
{
alert('error');
}
});
다음과 같은 오류가 발생합니다. (
나는 또한 데이터 타입을 시도했다 : "jsonp". 그것의 다른 URL을 만들고 내 서비스 URL을 누른 다음 404 오류가있어 URL에 내 몸 개체를 추가합니다.
내 브라우저 : firefox 36.0.4
어떻게하면이 오류를 제거 할 수 있습니까?
해결법
-
==============================
1.내 AJAX 호출과 서비스는 괜찮습니다. 인터넷에서 많은 검색을 한 후에 나는 서버 쪽 문제가 클라이언트 쪽이 아니라는 사실을 발견했습니다.
내 AJAX 호출과 서비스는 괜찮습니다. 인터넷에서 많은 검색을 한 후에 나는 서버 쪽 문제가 클라이언트 쪽이 아니라는 사실을 발견했습니다.
서버 측에서는 CORS 요청을 허용하는 필터를 구현해야한다.
필터는 다음과 같이 보입니다.
import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.filter.OncePerRequestFilter; public class CORSFilter extends OncePerRequestFilter { private static final Log LOG = LogFactory.getLog(CORSFilter.class); @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())) { LOG.trace("Sending Header...."); // CORS "pre-flight" request response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); // response.addHeader("Access-Control-Allow-Headers", "Authorization"); response.addHeader("Access-Control-Allow-Headers", "Content-Type"); response.addHeader("Access-Control-Max-Age", "1"); } filterChain.doFilter(request, response); } }
web.xml에서 다음과 같이 서비스 요청에이 필터를 적용합니다.
<filter> <filter-name>cors</filter-name> <filter-class>com.test.common.controller.CORSFilter</filter-class> <!-- your package name and filter class --> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
이것은이 문제를 겪은 다른 사람을 도울 수 있습니다. :)
-
==============================
2.기본적으로 허용되는 유일한 방법은 GET이며 서버 측에서 POST를 허용하지 않습니다.
기본적으로 허용되는 유일한 방법은 GET이며 서버 측에서 POST를 허용하지 않습니다.
Access-Control-Allow-Origin: *
이 헤더는 CORS 만 활성화하지만 다음을 추가해야합니다.
Access-Control-Allow-Methods: POST, GET
Mozilla 프로젝트의 HTTP 액세스 제어 (CORS)에 대한 자세한 방법
따라서 코드는 다음과 같아야합니다.
responseHeaders.add("Access-Control-Allow-Methods", "POST, GET"); // also added header to allow POST, GET method to be available responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
최신 정보:
나는 그 기사를 다시 읽고 몇 가지 세부 사항을 발견했다.
굵은 글씨로 읽을 수 있으면 데이터 용으로 다른 Content-Type (현재 contentType : "application / json; charset = utf-8")을 설정하거나 나중에 설명 할 프리 플라이트 기술을 사용해야합니다.
따라서 contentType을 변경하거나이 헤더를 요청에 적용 해보십시오.
Access-Control-Request-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE
그리고 당신의 응답에이 헤더 :
Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE
그 후에는 방법을 호출 할 수 있습니다.
-
==============================
3.다음은 크로스 플랫폼 스프링 부트 웹 서비스 호출에 대한 솔루션입니다.
다음은 크로스 플랫폼 스프링 부트 웹 서비스 호출에 대한 솔루션입니다.
응용 프로그램 URL : http : // localhost : 8080
웹 서비스 URL : http : // localhost : 9090
스프링 컨트롤러에서 다음 주석을 사용하십시오.
@CrossOrigin(origins = "http://localhost:8080") @RequestMapping(value = "/uri", method = RequestMethod.GET) public SomeObject someMethod(){ // your logic will come here }
from https://stackoverflow.com/questions/29389031/cross-origin-request-blocked-spring-rest-service-ajax by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 절대 uri : http://java.sun.com/jsp/jstl/core는 web.xml 또는이 응용 프로그램과 함께 배포 된 jar 파일에서 확인할 수 없습니다. (0) | 2019.03.30 |
---|---|
[SPRING] Spring 데이터 MongoDB Annotation @CreatedDate가 작동하지 않습니다. ID가 수동으로 할당 된 경우 (0) | 2019.03.30 |
[SPRING] Spring websocket이 특정 사용자에게 전송 (0) | 2019.03.30 |
[SPRING] Spring MVC에서 정적 페이지 주소 지정을 처리하는 방법 (0) | 2019.03.30 |
[SPRING] spring-mvc에서 페이지를 리디렉션하는 매개 변수를 전달하는 방법 (0) | 2019.03.30 |