@ 주제
CORS (Cross-origin resource sharing) 사이트간 데이터 주고 받기
@ 목적
URL 이 다른 사이트간 데이터 전송 작업을 위함
@ 내용
CORS (Cross-origin resource sharing) : 서로 다른 도메인에서 리소스를 공유하는 방식? 이라 볼 수 있다 .
기존에 있는 Same-Origin Policy ( 동일 출처 정책)와 반대 되는 개념으로 보면된다.
-
자바스크립트가 할 수 없는 것들 참고하기
예를 들어, www.example.com 이라는 사이트에서 사용하는 api가 있다. 해당 api는 외부에 공개하려는 목적이 아닌, 자신들의 사이트에서 사용하기 위해 만들었다고 치자. 그런데 이 api를 다른 사이트에서 알게 되었고 허락없이 무단으로 가져다 사용하게 된다면 이 사이트 입장에서는 상당히 곤란할 것이다. 그래서 나온 것이 Same-origin policy 정책이다. 프로토컬, 도메인, 포트가 모두 같을시 동일 출처 정책을 따른다고 볼 수 있다.
보통 api를 사용할 때, ajax를 사용하는데 이 same-origin policy를 따르지 않을 경우, 오류가 나면서 api 사용이 거절된다.
이걸 해결할 수 있는 방법 중 하나는 JSONP 방식이 있다.
js, css 등의 파일은 same-origin policy를 따르지 않아도 되기 때문에 서버에서 값을 돌려줄때 마치 js 파일처럼 값을 돌려주고, 클라이언트에서는 이 값을 콜백 함수로 재처리 하여 사용하는 방식이다.
JSONP 방식은 서버단에서 리턴해 줄 때 콜백함수이름으로 감싸서 보내주어야 한다.
예) CALLBACK NAME : myCall인 경우 myCall([{name:"철수"}])
스프링에서도 이를 해결할 수 있는 방법이 있는데
샘플 시작~~
-- jsp
var json2 = {myCode: 1212056, rvFlag: 1, vnr:"A0001"};
$.ajax({
url: "http://10.10.10.10:8518/api/if/test_aaa",
data: JSON.stringify(json),
type: "POST",
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
},
success: function(data){
console.log(data);
}
});
-- Controller
// @CrossOrigin(origins = "http://domain1.com, http://domain2.com") 이런식으로 허용하고 싶은 도메인만 설정도 가능하다.
@CrossOrigin // @CrossOrigin 어노테이션을 붙여주면 기본적으로 '모든 도메인, 모든 요청방식' 에 대해 허용 한다는 뜻이다.
@Controller
@RequestMapping("/api/if")
public class InterfaceResource {
@Autowired HttpServletRequest request;
@Autowired HttpServletResponse response;
@Autowired InterfaceService interfaceService;
@ResponseBody
@CrossOrigin
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST }, headers = "Accept=application/json", value="/status")
public ResponseEntity<?> a_status(@RequestBody Test test){
Map<String, Object> res = new HashMap<>();
res.put("RESPONSE", interfaceService.a_status(test));
return new ResponseEntity<>(res, HttpStatus.OK);
}
@ResponseBody
@CrossOrigin
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST }, headers = "Accept=application/json", value="/aprv")
public ResponseEntity<?> apon_pms_aprv(@RequestBody Test test){
Map<String, Object> res = new HashMap<>();
res.put("RESPONSE", interfaceService.aprv(test));
return new ResponseEntity<>(res, HttpStatus.OK);
}
//해더에 넣을거면
/*HttpHeaders headers = new HttpHeaders();
headers.set("Content-type", "application/javascript;charset=UTF-8");
headers.add("RTN_TYPE", res.get("RTN_TYPE"));
headers.add("RTN_MSG", res.get("RTN_MSG"));*/
}
--- service
public Map<String, Map<String, String>> b_status(Test test) {
Map<String, Map<String, String>> response = new HashMap<String, Map<String, String>>();
Map<String, String> output = new HashMap<String, String>();
Map<String, String> header = new HashMap<String, String>();
System.out.println(test.getMyCode());
String projectNo = test.getMyCode();
if( StringUtils.isEmpty(projectNo) ) {
this.setMyHeader("E", "MYCODE IS EMPTY", header);
response.put("HEADER", header);
return response;
}
// GET PMS INFOMATION
Project p = projectRepository.getProjectByProjectNo(projectNo);
if(p.getProjectId() != null ) {
output.put("NAME", p.getProjectTitle());
output.put("CREATOR", p.getCreatedBy() != null ? p.getCreatedBy().getName() : "-");
output.put("STATUS", p.getAponStatus() != null ? String.valueOf(p.getAponStatus()) : "");
this.setMyHeader("S", "OK", header);
} else {
this.setMyHeader("E", "COULD NOT FIND MATCHING PROJECT", header);
response.put("HEADER", header);
return response;
}
response.put("HEADER", header);
response.put("OUTPUT", output);
return response;
}
-- VO
package kr.co.bpnr.amorepms.service.dto;
import lombok.Data;
@Data // 롬복에서는 @Data 어노테이션을 적어주면 getter setter 전부 처리해주기 때문에 새로 만들 필요가 없다.
public class TEST {
//* MYCODE : project_no
//* APRVFLAG: 결재상태
//* APVNR : 결재문서 Doc ID
private String myCode;
private String rvFlag;
private String pvnr;
}
'기능 정리' 카테고리의 다른 글
오라클 시간별 조회방법 조건절 ! (0) | 2021.02.25 |
---|---|
Git ignore white space 설정 (0) | 2021.01.14 |
자바스크립트가 할 수 없는 것들 (0) | 2020.08.13 |
Same-Origin Policy (0) | 2020.08.12 |
util 태그 라이브러리의 사용 (0) | 2020.08.11 |