ajax CORS관련 문제 해결

1 minute read



CORS

  • 크로스 도메인에러
  • JavaScript에서 공공데이터 API호출시 Ajax 실행하려고 했는데 CORS 에러가 났다.
  • 해결방법 요약
    1. Java에서 API데이터를 불러온다.
    2. A.jsp의 request영역에 json 데이터를 등록
    3. 새로운 jsp인 B.jsp에서 A.jsp에 뿌려진 json데이터를 파싱한다.
  • 이 방법은 교수님께 여쭤보니 파싱을 한번 더 하는거니까 바로 가져오는 것 보다 느릴거라고 말씀하셨다 ㅠㅠ
  • 바로 가져오는 방법은 좀 더 시간이 필요할듯!…

해결1 : Java로 파싱하기

  • 파일설명
    • LHController.java : uri로 연결해주는 Controller
    • LHapiPractice.jsp : json데이터 받는 곳.
    • LHapiAjax.jsp : LHapiPractice.jsp에 뿌려진 json데이터 파싱해서 새롭게 보여주는 곳
  • Controller 생성
package kr.co.soyo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

@Controller
@RequestMapping("/ajax")
public class LHController {
	
	@RequestMapping("/LHapiPractice.do")
	public static void getLHapi(Model model) throws IOException {
  
      // API데이터 뿌려주는 곳.
      
        StringBuilder urlBuilder = new StringBuilder("https://data.myhome.go.kr:443/rentalHouseList"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=서비스키"); /*Service Key*/
        //urlBuilder.append("&" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + URLEncoder.encode("서비스키", "UTF-8")); /*공공데이터포털에서 받은 인증키*/
        urlBuilder.append("&" + URLEncoder.encode("brtcCode","UTF-8") + "=" + URLEncoder.encode("11", "UTF-8")); /*광역시도 코드*/
        urlBuilder.append("&" + URLEncoder.encode("signguCode","UTF-8") + "=" + URLEncoder.encode("140", "UTF-8")); /*시군구 코드*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("50", "UTF-8")); /*조회될 목록의 페이지당 데이터 개수 (기본값:10)*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("2", "UTF-8")); /*조회될 페이지의 번호 (기본값:1)*/
        URL url = new URL(urlBuilder.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        System.out.println("Response code: " + conn.getResponseCode());
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        rd.close();
        conn.disconnect();
        //System.out.println(sb.toString());
        
        JsonParser Parser = new JsonParser();
        JsonObject jsonObj = (JsonObject) Parser.parse(sb.toString());
        JsonArray memberArray = (JsonArray) jsonObj.get("hsmpList");
        
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        String jsonOuput = gson.toJson(memberArray);
       
        
        model.addAttribute("LHInfo",jsonOuput );
        
    }
	
	
	@RequestMapping(value="/LHapiAjax.do", method=RequestMethod.GET)
	public String LHapiAjax() {
		// 파싱하는 곳.
		return "ajax/LHapiAjax";
	}

}