默认情况下,浏览器会发送 cookie。
如果您设置标头的{credentials: 'omit'},您可以阻止在fetch 中发送cookie。 MDN
完整的fetch 示例:
const user = JSON.parse(localStorage.getItem('user'));
let headers = {};
if (user && user.token) {
headers = { 'Authorization': 'Bearer ' + user.token };
}
const requestOptions = {
method: 'GET',
headers: headers,
credentials: 'omit'
};
let req = await fetch(`${serverUrl}/api/v2/foo`, requestOptions);
if (req.ok === true) {
...
现在,当您登录时,在您的网站中,webapp 可以保存
将凭据放入 both localStorage 和 cookie。
示例:
let reqJson = await req.json();
// response is: {token: 'string'}
//// login successful if there's a jwt token in the response
if (reqJson.token) {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('user', JSON.stringify({token: reqJson.token}));
document.cookie = `token=${reqJson.token};`; //set the cookies for img, etc
}
因此,您的 web 应用程序使用 localStorage,就像您的智能手机应用程序一样。
浏览器默认通过发送 cookie 获取所有静态内容(img、video、a href)。
在服务器端,如果没有,您可以将cookie复制到授权头中。
Node.js+express 示例:
.use(function(req, res, next) { //function setHeader
if(req.cookies && req.headers &&
!Object.prototype.hasOwnProperty.call(req.headers, 'authorization') &&
Object.prototype.hasOwnProperty.call(req.cookies, 'token') &&
req.cookies.token.length > 0
) {
//req.cookies has no hasOwnProperty function,
// likely created with Object.create(null)
req.headers.authorization = 'Bearer ' + req.cookies.token.slice(0, req.cookies.token.length);
}
next();
})
我希望它对某人有所帮助。