vue前后端分离使用fetch 跨域请求时 session失效问题解决
2017-11-21 15:37
1226 查看
前台是vue使用fetch请求后台的登录方法,但是前台浏览器的控制台中的sessionid没有,要么就是跟后台的sessionid不一致,导致后台取验证码的时候是null,因为验证码是后台存在session中
在用fetch进行网络请求的时候,发现每次请求到服务端的时候,他的sessionId 都是不一样的,后面排查原来是在请求的时候fetch默认是不会带上本地jsessionId,以至于服务端无法接收到,所以会重新创建一个新的session。
针对这个问题,完整写法是:主要是credentials: 'include' 是解决跨域session丢失的问题,加上这一行以后,前端浏览器中的sessionid和后台打印的sessionid是一致的,但是参数传不过来,最后加了一个method:'post',就可以了
let fd=new FormData();fd.append('username',this.userName);
fd.append('password',this.userPwd);
fd.append('checkCode',this.code);
fetch(`${apiUrl}/login`,{
method:'post',
body:fd,
credentials: 'include'
}).then((res)=>res.json()).
then((res)=>{
console.log(res);
}).catch((res)=>console.log(res));
后台代码
(注:
response.setHeader("Access-Control-Allow-Origin", "http://192.168.1.136:8080";);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
response.setHeader("Access-Control-Allow-Credentials", "true");//是否支持cookie跨域
后台什么都不需要加,根本不需要加跨域这些东西)。
javascript 使用fetch进行跨域请求时默认是不带cookie的,所以会造成 session失效。
fetch(url, {method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: JSON.stringify({ data: options.data }) })credentials: 'include' 可以是fetch 带上cookie。但是问题了来。
原来在服务器端设置header (php 服务器)
header("Access-Control-Allow-Origin: *");
会报错:
A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:8000' is therefore not allowed access.
可以看到不允许 使用‘*’ 号了,那么就改成 访问域名(这里是本地调用所以是 http://localhost:8000)
header("Access-Control-Allow-Origin: http://localhost:8000");[/code]
改完后再次发送请求,还是报错
Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'http://localhost:8000' is therefore not allowed access.
说'Access-Control-Allow-Credentials 头必须是true,那么继续增加header("Access-Control-Allow-Credentials: true");
增加完后可以正常访问了,而且session也有了。
ps: fetch 有个mode 是no-cors ,发现设置后返回的status是0,查资料后no-corsmode
is only to CDN content, such as scripts, CSS and image, you cannot be used for getting data,response.status = 0is right behavior
no-cors 模式只能用来获取CDN内容,比如脚本,css文件和图片,如果用来获取数据比如json格式就会返回status=0终极方案(推荐使用):
针对于解决前后台sessionid一致问题以后又遇到 参数传递不到后台,最后这样解决:
既然fetch不会自动转FormData,那我们自己new一个FormData,直接传给body。
在FormData中也可以传递字节流实现上传图片的功能。参考:http://blog.csdn.net/codetomylaw/article/details/52446786
[javascript] view plain copy
let formData = new FormData();
formData.append("name","admin");
formData.append("password","admin123");
etch(url , {
method: 'POST',
headers: {},
body: formData,
).then((response) => {
if (response.ok) {
return response.json();
}
).then((json) => {
alert(JSON.stringify(json));
).catch((error) => {
console.error(error);
);
这样我们就可以在Server端获取到name和password的值了。
相关文章推荐
- Node学习(4)vue+node 前后端分离项目ajax跨域session问题解决
- React如何解决fetch跨域请求时session失效问题
- vue-cli的axios使用方法,get、post请求的跨域问题解决
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
- 使用proxytable 配置解决 vue-cli 的跨域请求问题【推荐】
- java中使用Cookie替代Session解决跨域Session失效问题
- vue2 前后端分离项目ajax跨域session问题解决方法
- javascript fetch 跨域请求时 session失效问题
- java 浅析跨域问题以及如何使用Cors解决前后端分离部署项目所遇到的跨域问题
- vue+springboot前后端分离实现单点登录跨域问题解决方法
- 使用fetch轻松解决JS跨域请求问题——无需CORS,jsonp
- vuejs中vue-resource或使用axios发送请求及解决跨域问题
- 使用Frame引用跨域站点页面时,Session失效问题解决方案
- vue2 前后端分离项目ajax跨域session问题解决
- vue.js中使用vueResource向后台请求数据时出现跨域访问失败的问题
- iframe跨域与session失效问题的解决办法
- 跨域请求,关于后端session会话丢失的解决办法
- 跨域请求,关于后端session会话丢失的解决办法
- 简单设置,解决使用webpack前后端跨域发送cookie的问题
- 简单设置,解决使用webpack前后端跨域发送cookie的问题