알 수 없는 브라우저 http 캐시
4000 단어 http 캐시
강력한 캐시와 협상 캐시.
1. 브라우저는 어떤 자원을 요청하고 헤더를 통해 강한 캐시 여부를 판단합니다. 강한 캐시라면 로컬에서 캐시 파일을 직접 가져와 브라우저에 요청하지 않습니다.
2. 강력한 캐시가 아니라면 서버에 요청을 보내고 서버는 일부request 헤더를 통해 협상 캐시인지 확인합니다. 만약 그렇다면 서버는 요청을 되돌려주지만 자원을 되돌려주지 않고 클라이언트가 로컬 캐시에서 자원을 가져오도록 합니다
3. 캐시와 협상 캐시, 자원은 모두 로컬입니다. 다만 캐시는 요청을 서버에 보내지 않습니다. 협상 캐시는 요청을 서버에 보냅니다.
4. 협상 캐시가 아닌 브라우저는 자원을 클라이언트에게 보냅니다.
강력한 캐시: 서버가 요청에 처음 응답할 때 브라우저에 로컬이 존재한다고 알리고 시간을 설정하며 시간 내에 이 자원을 가져오면 로컬에서 가져옵니다.Expires Cache-Control 두 응답 첫 번째 필드는 만료 시간과 최대 수명 주기를 알려줍니다.캐시에서 자원을 찾을 것을 다시 요청합니다. 요청 시간이 Expires보다 빠르면 로컬 자원을 사용할 수 있습니다.http1.1 Cache-Control 캐시 리소스의 최대 생명주기, 초 단위.같이 Cache-Control 위주로 사용합니다.협상 캐시: 파일의 마지막 수정 시간, 서버는 자원의 업데이트 여부를 판단하고, 업데이트되지 않으면 304는 notmodified를 표시하고, 브라우저는 캐시에서 불러옵니다.LastModified: 리소스의 마지막 업데이트 시간을 서버와 함께 반환합니다.if-modified-Since가 첫 번째 필드를 요청하면 두 시간을 비교하여 자원의 수정 여부를 판단합니다.수정이 없으면 캐시를 협상합니다.
절차 설명:
1. 브라우저가 처음으로 리소스, 서버 응답, 리소스 반환, 응답 헤더에 Last-Modified를 요청합니다.
2. 브라우저는 리소스를 다시 요청하고 요청 헤더에 ifmodifiedsince를 추가합니다. 이 값은 지난번 Last-Modified의 값입니다.
3. 서버는 요청을 받아들여 ifmodifiedsince 값과 자원의 마지막 수정 값을 비교하고 일치하면 304, 협상 캐시를 되돌려줍니다.
그렇다면 앞부분은 어떻게 실현됩니까?
ifModified 이해
ifModified (Boolean) : ( : false) 。 HTTP Last-Modified 。
ifModified의 정의에서 알 수 있듯이 ifModified가true로 설정되면 요청 헤더에 If-Modified-Since를 추가합니다. if-Modified-Since는 표준 http 요청 헤더 탭입니다. http 요청을 보낼 때 브라우저 캐시 페이지의 마지막 수정 시간을 서버에 보내면 서버는 이 시간을 서버의 실제 파일의 마지막 수정 시간과 비교합니다.
만약 시간이 일치한다면 http 상태 코드 304를 되돌려줍니다. (파일 내용을 되돌려주지 않습니다.)
만약 시간이 일치하지 않으면 http 상태 코드 200과 새로운 파일 내용을 되돌려줍니다. 클라이언트가 받은 후에 낡은 파일을 버리고 새 파일을 캐시하여 브라우저에 표시합니다.
Last-Modified 이해
Last-Modified: 이 파일의 마지막 수정 날짜를 표시합니다. 파일 속성과 서버는 상관없습니다.
정적 자원 파일에 유용한 속성입니다. 정적 자원 파일을 요청할 때 요청 헤더는 If-Modified-Since:xx(시간) 속성을 가지고 있습니다. 이 속성은 지난 요청 때 얻은 Last-Modified 시간입니다. 만약 이번 요청 헤더 시간과 응답 헤더 시간이 일치한다면 304 상태 코드를 되돌려 브라우저가 현재 가지고 있는 페이지가 최신 데이터가 필요하지 않다는 것을 알려 줍니다.
실현
function getAjax(url, sendData, state = true) {
return new Promise((resolve, reject) => {
$.ajax({
url: url,
data: sendData,
type: 'get',
dataType: 'json',
cache: !state, //
ifModified: state,//
success(data, des, status) {
if (status.status === 200) {
if (data.code === 200) {
return resolve(data.data);
} else {
return reject({code: data.code, message: data.message});
}
}
if (status.status === 304) {
getAjax(url, sendData, false)
.then(data => {
resolve(data);
})
.catch(data => {
reject(data);
});
}
}, error() {
return reject({code: 503, message: ' , !'});
}
});
});
}
분석
요약: 캐시를 사용하는 목적은 계산, IO, 네트워크 등 시간을 줄이고 신속하게 되돌아갈 수 있도록 하는 것이다. 특히 데이터가 비교적 많을 때 많은 서버 대역폭과 압력을 절약할 수 있다.