점심을 먹고, 하려보니 갑자기 안된당... 하하...

분명 잘 되던건데.. 딱히 뭔가 클래스를 바꾼게 없는데..

 

원인은 클래스가 컴파일에 참조가 안되서 생기는 에러라고 합데다.

 

해결 방법

 

Project > Properties > Java Build Path > Order and Export > JRE 라이브러리 사용여부 체크

jre 라이브러리 check > apply > 서버 clean 및 재기동

 

로컬로 테스트하던 잘 사용하던 중에 난 에러

 

 

 

Access to XMLHttpRequest at 'http://localhost:8080/SFSJ_API/api/001001000/getJsonFromIOExcel.do' from origin 'http://localhost:7080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

 

라는 문제로 에러가 나는 이유는

 

웹 서버 개발시 자바스크립트로 외부서버의 경로로 ajax요청을 날리면서 실패할 때,

즉 서로 다른 도메인에서 자료를 가져 오면서 CORS(Cross Origin Resource Sharing) 라는 에러가 발생하였다.

 

해결방안은 여러가지가 있는데

 1.서버에서 설정하는 방법

 (이 방법에 대해서는 정확한 방법을 모르겠다..)

 

 2. 크롬에서 웹 시큐리티 막기

   - 크롬의 바로가기의 '속성 > 바로가기 > 대상' 에 "--disable-web-security --user-data-dir='폴더위치'" 삽입

 

 

   * --user-data-dir의 위치는 해당크롬에서 오류가 났을때, 백업내용? 오류내용?이 들어가는 위치라고 한다. 

   * 기존의 크롬도 사용하겠다하면 바로가기를 하나 더 만든 후 이름과 속성을 수정 하면 댐.       

 

--disable-web-security 적용 된 크롬 상단에 표시 됨.

 

 

 3. 크롬 웹 스토어에서 CORS 프로그램 깔기.

  - 크롬 웹스토어에 들어갑니다.

   (https://chrome.google.com/webstore/search/CORS?hl=ko)

  - 검색창에 CORS를 친 후 프로그램 추가

 

저는 'Allow CORS: Access-Control-Allow-Origin' 이라는 프로그램을 설치하고 적용했습니다.

이 프로그램 기준으로 사용법은

  - 크롬의 좌측 상간의 C:라는 것을 눌러줍니다.

 - C: 를 누르면 사진과 같이 뜨는데, 흑색 커다란 C:를 누르면 활성화가 됩니다.

 - 사용을 안하실때는 색상 C:를 다시 누르면 비활성화가 됩니다.

 GET 방식으로 파일을 다운로드를 하다보니 크롬에서는 괜찮지만, IE에서는 문제가 발생한다.


 "서버를 찾을 수 없습니다" 라던가 " 이 페이지는 존재 하지않습니다" 라던가 등등의 문제가 발생한다.


 이유는 간단한데, GET방식의 글자 제한으로 인한 문제이다..

 글자를 줄일수 있다면야 계속 사용하겠지만, 그건 안되고 ㅜㅜ 


 그래서 GET을 POST 방식으로 바꾸기로했다.

 (사실 말이 POST방식이지 GET을 사용하여 다운로드를 한다.)


 그래도 혹시 모르니 GET, POST 방식 모두 올려 놓도록 하겠다.


 GET 방식

 view 단


location.href = url + '/filedownload?' + encodeURI(me.form.serialize() , "UTF-8");


location.href 을 사용하면 get 방식으로 사용이 된다고 함.

encodeURI( 포맷, "포맷방식") 을 사용하여 한글 깨짐이 없도록 한다.



Controller 단

    @RequestMapping(value = "/filedownload", method = RequestMethod.GET)

    public ModelAndView getFile(@RequestParam ... ) throws Exception {


        String fileNm = "파일명";

        

        String path = "파일의 경로"


        if(path == null){

        return null;

        }

        File file = new File(path);


        param.put("file", file);

        param.put("fileName", fileNm);

        param.put("contentType", "application/download;charset=UTF-8");


        return new ModelAndView("downloadView", param);

    }



POST 방식


view단

            $.ajax({

                   url: url + '/filedownload',

                   method: 'POST',

                   loadingTarget: true,

                   data: me.form.serialize(),

                   dataType: 'json',

                   success: function(data) {

                     if (data.header.success) {

                         if(!data.body)

                             return;

                         var path = 'path=' + data.body;

                         location.href = url + '/filedownload?' +  encodeURI(path , "UTF-8");

                       }

                   }

               });


Controller 단


    @RequestMapping(value = "/filedownload", method = RequestMethod.POST)

    @ResponseBody

    public Result getFile(@RequestParam ... ) throws Exception {


        String fileNm = "파일명";

        String path = "파일의 경로"


        path = URLEncoder.encode(path, "UTF-8");


        return new Result(true, "0000", (Object) path);

    }

    

    

    @RequestMapping(value = "/filedownload", method = RequestMethod.GET)

    public ModelAndView getFile(@RequestParam ... ) throws Exception {

        

        String path = (String) param.get("path");    // 위에서 보냈던 경로가 들어옴

        

        if(path == null){

        return null;

        }

        

        path = URLDecoder.decode(path, "UTF-8");

        String fileNm = "파일명";

        

        File file = new File(path);


        param.put("file", file);

        param.put("fileName", fileNm);

        param.put("contentType", "application/download;charset=UTF-8");


        return new ModelAndView("downloadView", param);

    }


ajax로 post 방식으로 값을 먼저 보낸 후,

파일 경로를 받아 get으로 다운을 하면 된다.



 개발을 하다보면 서버로의 요청을 할 때 주로 get과 post 방식을 많이 쓰게 된다.

 그래서 이게 뭔가 다시 단어를 재 정립 해보았다.


 GET 방식

  - 주소(URL) 뒤에 데이터의 값이 붙는다.

ex) aaa.com?search=abc&page=2 

> ?뒤에 전송값이 붙어서 가게된다.

  - 보안에 취약하다

  - 길이에 제한이 있다.(= 전송의 한계)

  - POST방식보다 빠르다


 POST 방식

  - form을 이용해 action이 취해진다.

  - GET 방식보다 보안성이 높다.

  - 크기의 제한이 없다.

  - GET방식보다 느리다.


 간단하게 둘의 차이를 정의하자면


  GET은 가져오는 것이고 POST는 수행하는 것.


 즉, 단어의 뜻 그대로 get은 웹 서버에서 데이터를 가지고 올때,

 post 브라우저에서 서버로 데이터를 보낼 때, 주로 사용이 된다고 보면 될것이다.


 ==================================


 p.s)  GET에 글자의 제한이 있다고 했지만,

 크롬같은 브라우저에는 제한이 없고, IE같은 경우에는 글자수에 제한이 남아있다.

 



'IT > 기타' 카테고리의 다른 글

엑셀 사진 저장하는 방법  (0) 2019.01.04

코틀린에도 기본적인 변수의 타입은 숫자, 문자, 참거짓 등이 있지만

선언 방식은 자바와는 사뭇 다른데,


자바에서의 변수를 선언은

문자형 : String str;

숫자 : int num;

참거짓 : boolean bol;

으로 타입을 선언하고 변수명을 말한다면,


코틀린에서는 

 var str: String = "가나다"

①  ②    ③           ④   

 

으로 사용을 하게 되는데, 자세히 살펴보자면 

var는 함수 선언으로 val과 var가 있습니다.


  * val : 변할수 없는 상수. (자바 - final 같은)

  * var : 일반 함수선언


즉 val로 선언을 할시에는 후의 코드에서

str = "라마바" 와 같은 선언이 불가능 하고 var에서는 가능합니다.


② 은 변수명을 선언해주는 것으로, 본인의 목적에 맞는 명을 적어주면 됩니다.


③ 은 타입을 선언을 하는 부분입니다.

이때 선언을 할때는 변수명뒤에 반드시 : 를 적어둔 다음 선언을 해야합니다.

자바와 달리 생략도 가능하고, 넣어주는 값에 따라 어떤 타입인지 추론이 가능합니다.

 ex) var x = 1  // int 추정

var y = true  // boolean


④ 은 넣어주는 값을 의미하는데, 이 역시 생략은 가능합니다.


+ Recent posts