javascript - 在static资源里使用ajax请求session丢失?
伊谢尔伦
伊谢尔伦 2017-04-10 16:37:19
[JavaScript讨论组]

准备用express做一个登陆模块,前台是用react做的,我在submit按钮handle是这么写的

handleSubmit(e) {
    e.preventDefault();
    fetch('/login',{
        method:"POST",
        headers:{ "Content-Type": "application/json"},
        body:JSON.stringify(this.state.formData)
    })
        .then(function(response) {
            return response.json();
        })
        .then(function(json) {
            console.log('parsed json', json);
        }).catch(function(ex) {
        console.log('parsing failed', ex);
    });
}

这个请求是在login.js这个文件发起的,它是一个静态的js文件,向login页面发起了post请求。然后我在后台进行如下操作以测试session是否可用。

app.post("/login", function (req, res) {
    if(req.session.isVisit) {
        req.session.isVisit++;
        res.send('<p>post ->第 ' + req.session.isVisit + '次来此页面</p>');
    } else {
        req.session.isVisit = 1;
        res.send({status:"100",message:"第一次登陆"});
        console.log(req.session);
    }
});

结果每次发起请求,cookie都在发生变化。
如图:


我使用postman进行了测试。结果却不一样。也就是说这个session是能正常工作的但是为什么用fetch进行ajax请求浏览器不会自动保存cookie了?还是说登陆操作必须用get请求?

我原先是做Android客户端,iOS客户端的,一般都是发一个post请求然后记录cookie在缓存中,就算登陆了,这里的cookie死活记录不下来,根本没法登陆,想知道浏览器cookie是跟文件相关的吗?(比如是和login.js相关?)


问题解决

原来是fetch的坑,post请求不会自带cookie,不过只要带一句代码就能把cookie带上去了。
最终代码如下:

handleSubmit(e) {
    e.preventDefault();
    fetch('/login',{
        method:"POST",
        credentials: 'include',
        headers:{ "Content-Type": "application/json"},
        body:JSON.stringify(this.state.formData)
    })
        .then(function(response) {
            return response.json();
        })
        .then(function(json) {
            console.log('parsed json', json);
        }).catch(function(ex) {
        console.log('parsing failed', ex);
    });
}
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(3)
巴扎黑

fetch 的问题,你的 fetch 从你传的参数猜测应该要全都指定 request 参数(因为你指定 body headers 等),session 依赖 cookie, fetch 明显没有传递 cookie 结果你的服务器每次接收到都认为你是一个全新的请求,给你开一个全新的 session
之后,server响应给你了response.cookie ,你再次 fetch 的时候依然不带服务器给你的 cookie ,依然是一个全新请求。

黄舟

一般动态网页都是服务器脚本自动处理了,对于静态页面,你需要手动处理 token。

大家讲道理

我当时遇到过这种情况是后端nginx配置问题,不知道你的后端环境,有可能是后端配置

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号