JSONP JS 크로스 오 버 문제 해결 실현
기초 개념
같은 소스 정책:같은 프로 토 콜,같은 도 메 인 이름,같은 엔 드 구호.세 가 지 를 만족 시 키 지 않 는 다 면 그 중 하 나 는 모두 크로스 오 버 문제 에 속한다.
몇 가지 간단 한 예 를 들다
1: https://www.a.com:8080도착 하 다http://www.a.com:8080도 메 인 이름,포트 는 같 지만 프로 토 콜 은 다 릅 니 다.
2: https://www.a.com:8080도착 하 다https://www.b.com:8080도 메 인 간 요청(프로 토 콜,포트 는 같 지만 도 메 인 이름 은 다 릅 니 다)
3: https://www.a.com:8080도착 하 다https://www.a.com:9090도 메 인 간 요청(프로 토 콜,도 메 인 이름 은 같 지만 포트 는 다 릅 니 다)
크로스 필드:크로스 필드 의 안전 제한 은 모두 브 라 우 저 측 에 있 는 것 이 고 서버 측 에 크로스 필드 안전 제한 이 존재 하지 않 습 니 다.브 라 우 저의 동원 정책 은 원본 에서 불 러 온 문서 나 스 크 립 트 와 다른 원본 에서 온 자원 의 상호작용 을 제한 합 니 다.
2.JSON 과 JSONP 구별
웹 페이지 에서 js 파일 을 호출 하 는 것 은 크로스 필드 문제 의 영향 을 받 지 않 는 다 는 것 을 알 게 되 었 습 니 다.그리고 우 리 는 src 라 는 속성 을 가 진 태그 가 모두 도 메 인 을 뛰 어 넘 는 능력 을 가지 고 있다 는 것 을 발견 했다.예 를 들 어 img 과 script 이다.html 페이지 에서 우 리 는 그림 을 도입 하 는 작업 을 자주 합 니 다.img 태그 의 src 속성 을 통 해 정적 자원 을 요청 할 수 있 습 니 다.
우 리 는 이것 이 본질 적 으로 GET 요청 이라는 것 을 알 수 있다.마찬가지 로 링크 와 script 의 href 와 src 역시 GET 요청 을 통 해 자원 을 요청 할 수 있다.
<script src="http://localhost:9090/api"></script>
우 리 는 이것 이 본질 적 으로 GET 요청 이라는 것 을 알 수 있다.마찬가지 로 링크 와 script 의 href 와 src 역시 GET 요청 을 통 해 자원 을 요청 할 수 있다.이들 은 동원 전략의 영향 을 받 지 않 았 다.jsonp 의 실현 원 리 는 바로 이 전략의 작은'bug'를 이용 하여 요 구 를 뛰 어 넘 는 것 이다.GET 요청 인 이상 서버 는 이 요청 을 받 고 응답 할 수 있 습 니 다.다음은 구체 적 으로 실현 해 봅 시다!
4.원리 와 크로스 필드 실현
구체 적 인 절차(원리)
jsonp 의 실행 절 차 는 사실 간단 한 두 단계 이다.첫째,백 엔 드 에서 들 려 오 는 데 이 터 를 받 아들 일 수 있 도록 전단 에 파 라 메 터 를 미리 정의 합 니 다.둘째,백 엔 드 에서 server 서 비 스 를 시작 하여 전송 할 데 이 터 를 정 의 된 리 셋 함수 이름 에 결 과 를 되 돌려 주 는 방식 으로 전단 에 전달 합 니 다.
//
<script>
// 1 callback
// 2 callbackName( )
function onResponse(posts) {
console.log(posts);
}
//
</script>
<!-- -->
<!-- -->
<script src="http://localhost:9090/api"></script>
//
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/api') {
let posts = ['js', 'php'];
res.end(`onResponse(${JSON.stringify(posts)})`);
}
})
.listen(9090, () => {
console.log(9090)
})
전단 script 의 src 요청 이 완료 되면 백 엔 드 는 전단 에 문자열 onResponse(["js","phop"])를 되 돌려 줍 니 다.script 태그 때문에 브 라 우 저 는 이 문자열 을 js 로 실행 합 니 다.이렇게 해서 우 리 는 처음에 전단 에서 정 의 된 리 셋 이 실 행 될 것 이 고 우 리 는 데 이 터 를 얻 었 다.
포장 하 다
이상 은 간단 한 요청 이 있 을 뿐 실제 항목 에 많은 요청 이 있 을 것 입 니 다.우 리 는 한 줄 의 script 태그 와 반전 함 수 를 정의 할 수 없 을 것 입 니 다.이렇게 쓴 코드 는 너무 융통성 이 없다.패 키 징 의 목적 중 하 나 는 전단 에서 리 셋 함수 의 이름 을 유연 하 게 수정 할 수 있 기 위해 서 입 니 다.앞 뒤 에서 리 셋 함 수 를 죽 이 는 것 이 아 닙 니 다.동시에 코드 를 봉 한 후에 우 리 는 수 동 으로 리 셋 함 수 를 만 들 지 않 아 도 된다.봉 인 된 함 수 는 src 의 주 소 를 자동 으로 넣 고 리 셋 함수 이름 을 자동 으로 만 드 는 것 을 도와 준다.
//
const http = require('http');
const url = require('url');
http.createServer((req, res) => {
// /api?callback=onResponse
// url callback
if(req.url.includes('/api')) {
let myurl = url.parse(req.url);
let params = new URLSearchParams(myurl.query)
let posts = ['js', 'php'];
let mathodName = params.get('callback');
res.end(`${mathodName}(${JSON.stringify(posts)})`)
}
})
.listen(9090, () => {
console.log(9090);
})
// ( body )
<script>
function jsonp(url, options) {
//
const { timeout } = options;
return new Promise((resolve, reject) => {
//
let funcName = `jsonp${Date.now()}`;
let time = null, scriptNode;
// callback
window[funcName] = function(data) {
if (timeout) clearTimeout(time);
resolve(data);
//
// script
delete window[funcName];
document.body.removeChild(scriptNode);
}
// script
scriptNode = document.createElement('script');
// script src
scriptNode.src = `${url}?callback=${funcName}`;
//
document.body.appendChild(scriptNode);
time = setTimeout(() => {
reject('network err, timeout')
}, timeout)
//
scriptNode.onerror = function(err) {
reject(err);
}
})
}
jsonp('http://localhost:9090/api', {
callBack: 'res1',
//
timeout: 3000
})
//
.then(res => {
console.log('jsonp->', res);
})
//
.catch(err => {
console.log("network err!")
})
</script>
총화
1:장점
POST 등 다른 유형의 HTTP 요청 대신 GET 요청 만 지원 합 니 다.
크로스 도 메 인 HTTP 요청 만 지원 합 니 다.서로 다른 도 메 인 두 페이지 간 에 자바 스 크 립 트 호출 을 어떻게 하 는 지 해결 할 수 없습니다.
JSONP 가 JS 크로스 도 메 인 문 제 를 해결 하 는 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.JSONP 가 JS 크로스 도 메 인 을 해결 하 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 판단 수조에 요소 구현 방법 요약 포함 여부for를 사용하는 장점은break와 결합하여 조건을 만족시키는 상황에서 즉시 순환을 뛰어넘을 수 있다는 것이다. 만약에 첫 번째 요소가 조건에 부합된다면 후속 순환 절차는 모두 최적화되어 직접 뛰어넘을 수 있다. 그...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.