Java 크로스 도메인 문제 처리 상세 정보

4184 단어 java도메인 간
앞말
여러분이 프런트엔드 스크립트를 쓸 때 백엔드로 데이터를 보내는 경우가 종종 있을 거라고 믿습니다. 그러나 브라우저의 제한으로 인해 서로 다른 도메인 이름 간의 데이터는 서로 접근할 수 없습니다. 그러면 프런트엔드와 백엔드는 어떻게 데이터 간의 교환을 합니까?
JavaScript는 보안상의 이유로 페이지의 크로스 도메인에서 다른 페이지의 대상을 호출하는 것을 허락하지 않습니다. 그러면 문제가 발생했습니다. 크로스 도메인 문제는 무엇입니까?
답: 이것은 브라우저 동원 정책의 제한으로 인해 현재 자바스크립트를 지원하는 모든 브라우저에서 이 정책을 사용하고 있습니다.그럼 동원은 무엇일까요?동원이란 세 가지 측면에서'동일하다'는 것을 가리킨다.
  • 도메인 이름이 같다
  • 협의는 같다
  • 포트 동일
  • 다음은 몇 가지 예를 들어 동원 전략을 더욱 잘 이해하는 데 도움을 준다.
    URL
    설명
    통신 허용 여부
    http://www.a.com/a.js  
    http://www.a.com/b.js
    동일한 도메인 이름
    허락
    http://www.a.com/a.js  
    http://www.b.com/a.js
    다른 도메인 이름
    허용되지 않음
    http://www.a.com:8000/a.js
    http://www.a.com/b.js
    동일한 도메인 이름과 다른 포트
    허용되지 않음
    https://www.a.com/a.js  
    http://www.a.com/b.js
    동일한 도메인 이름과 다른 프로토콜
    허용되지 않음
    JAVA에서 도메인 간 문제를 처리하는 데는 일반적으로 다음과 같은 두 가지 일반적인 해결 방법이 있습니다.
    첫 번째 해결 방법
    백그라운드 코드는 요청된 서브렛에 Header 설정을 추가합니다.
    
    response.setHeader("Access-Control-Allow-Origin", "*");
    PrintWriter out =null;
    try
    {
     out = response.getWriter();
    } catch (IOException e)
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    out.print("{'status':'ok'}");
    out.flush();
    out.close();
    Access-Control-Allow-Origin 이 Header는 W3C 표준에서 이 크로스 도메인 요청이 통과될 수 있는지 확인하는 데 사용되며, 값이 *이면 현재 페이지가 크로스 도메인에 접근할 수 있음을 나타냅니다.기본적으로 허용되지 않습니다.
    프런트엔드 JS에서 Servlet에 요청해야 합니다. 요청 코드는 다음과 같습니다.
    
    $.ajax({
     url: "your url",
     type:"get or post",
     dataType:"json",
     data:{
     ....
     },
     success:function(data){
     ...
     }
    두 번째 해결 방법
    jsonp를 통해 전역적으로 요청하는 방식입니다.JSONP와 JSON은 알파벳의 차이만 있지만 그들은 완전히 별개의 문제이기 때문에 많은 사람들이 그들을 헷갈리게 하기 쉽다.JSON은 데이터 교환의 형식이고 JSONP는 비공식적인 크로스 도메인 데이터 상호작용 프로토콜이다.
    우선 프런트엔드 JS가 요청을 어떻게 보내는지 말씀드리겠습니다.코드는 다음과 같습니다.
    
    $.ajax({
     url:"your url",
     type:"get or post",
     async:false,
     dataType : "jsonp",
     // callback function 
     jsonp:"callbackparam",
     //callback function 
     jsonpCallback:"success_jsonpCallback",
     success:function(data){
     console.log(data);
     },
     error:function(data){
     console.log(data);
     }
    });
    여기 콜백파라마와success_jsonpCallback은 전송된 데이터 데이터의 키 값이 맞다고 이해할 수 있습니다. 사용자 정의할 수 있지만, callbackparam은 백그라운드와 매개 변수의 이름을 정해야 합니다. 백그라운드는 이 매개 변수 안에 있는 값 (즉success_jsonpCallback) 을 가져와야 하기 때문입니다.
    다음은 가장 중요한 것이 왔습니다. 백그라운드에서 데이터를 어떻게 얻고 되돌려줍니까?코드는 다음과 같습니다.
    
    PrintWriter out =null;
    String callback=req.getParameter("callbackparam");
    String json=callback+"({'status':'ok'})";
    try
    {
     out = resp.getWriter();
    } catch (IOException e)
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    out.print(json);
    out.flush();
    out.close();
    우선 callbackparam이라는 파라미터의 값을 가져와야 합니다. 여기서 가져온 값은 "success_jsonpCallback"입니다.그리고 이 값을 괄호 한 쌍을 추가합니다.괄호 안에 당신이 되돌려야 할 데이터 내용을 넣으세요. 예를 들어 여기 JSON 대상을 되돌려줍니다.물론 다른 대상도 되돌릴 수 있다. 예를 들어 문자열 형식의 데이터만 되돌려도 된다.마지막 프런트엔드 JS가 반환하는 데이터는 다음과 같습니다.
    
    success_jsonpCallback({'status':'ok'})
    브라우저는 자동으로 json 대상으로 해석됩니다. 이 때는success 리셋 함수에서 데이터를 직접 사용해야 합니다.status면 돼요.
    총결산
    이상은 바로 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 만약에 의문이 있으면 여러분은 댓글을 남겨 교류할 수 있습니다. 저희에 대한 지지에 감사드립니다.

    좋은 웹페이지 즐겨찾기