很多童鞋会发现vue请求api接口的时候多个地址没法共享session,也就是session会丢失。我们知道session是基于cookie的,ajax请求没法共享session主要是因为cookie跨域引起的。cookie跨域如何解决呢?
程序出错。uniapp取cookie缺失是经常性发生的情况,官方文档提示是程序出错导致的,uni-ap是一个使用Vuejs开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序、快应用等多个平台。cookies中文名称为小型文本文件,指某些网站为了辨别用户身份而储存在用户本地终端(ClientSide)上的数据(通常经过加密)。
一,cookie的使用
1,首先加载模块
npm i js-cookie -S
2,在使用cookie的页面上进行引入
import Cookies from 'js-cookie'
3,使用方法
创建一个在整个网站上有效的Cookie
Cookiesset('name', 'value');
创建一个从现在起7天后过期的cookie,在整个站点上有效:
Cookiesset('name', 'value', { expires: 7 });
创建一个过期的cookie,对当前页面的路径有效:
Cookiesset('name', 'value', { expires: 7, path: '' });
读取cookie:
Cookiesget('name'); // => 'value'
Cookiesget('nothing'); // => undefined
阅读所有可见的Cookie:
Cookiesget(); // => { name: 'value' }
删除cookie:
Cookiesremove('name');
删除对当前页面路径有效的cookie:
Cookiesset('name', 'value', { path: '' });
Cookiesremove('name'); // fail!
Cookiesremove('name', { path: '' }); // removed!
重要!删除cookie时,您必须传递用于设置cookie的完全相同的路径和域属性,除非您依赖于默认属性。
注意:删除未存在的cookie不会引发任何异常,也不会返回任何值
二,localStorage的使用
注:vue下使用localStorage和H5使用localStorage的方法是一致的,不需要引入插件
1,储存
//数据
localStoragesetItem('userName','HelloWeen');
2,获取
localStoragegetItem('userName')
3,删除
localStorageremoveItem('userName');
4,localStorage可以储存JSON对象,且没有时间限制的数据存储 ,除非主动删除。
//数组
var arr=[1,2,3];
localStoragesetItem("temp",arr); //会返回1,2,3
consolelog(typeof localStoragegetItem("temp"));//string
consolelog(localStoragegetItem("temp"));//1,2,3
5,localStoragesetItem() 不会自动将Json对象转成字符串形式
var user= {"userName": "hello","age": 2};
typeof localStoragegetItem("user");//也会返回String
localStoragesetItem("user", user);//但是返回[object Object],
6,用localStoragesetItem()正确存储JSON对象方法是:
存储前先用JSONstringify()方法将json对象转换成字符串形式
JSONstringify() 方法可以将任意的 JavaScript 值序列化成 JSON 字符串
1
2
3
1
2
3
4
5
1
1
1
2
1
2
3
1
1
1
2
1
1
1
1
1
获取的时候要将之前存储的JSON字符串使用JSONparse()先转成JSON对象再进行 *** 作
var user= {"userName": "hello","age": 2};
user= JSONstringify(user); //转化为JSON字符串 "{"userName":"hello","age":2}"
localStoragesetItem("user", user);//返回{"userName":"hello","age":2}
user=JSONparse(localStoragegetItem("user"));
三,sessionStorage的使用
定义和使用
localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。
sessionStorage 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。
提示: 如果你想在浏览器窗口关闭后还保留数据,可以使用 localStorage 属性, 改数据对象没有过期时间,今天、下周、明年都能用,除非你手动去删除。
1,方法
sessionStoragekey(int index) //返回当前 sessionStorage 对象的第index序号的key名称。若没有返回null。
1
1
2
3
4
sessionStoragegetItem(string key) //返回键名(key)对应的值(value)。若没有返回null。
sessionStoragesetItem(string key, string value) //该方法接受一个键名(key)和值(value)作为参数,将键值对添加到存储中;如果键名存在,则更新其对应的值。
sessionStorageremoveItem(string key) //将指定的键名(key)从 sessionStorage 对象中移除。
sessionStorageclear() //清除 sessionStorage 对象所有的项。
1 最近得到一个新需求,需要在后台管理页面加上用户权限控制,通过后台放在cookie里面的token进行判断;
2 获取cookie里面的token:
21 我们在用vuejs里面的indexhtml写一个全局的函数:
3 这样我们通过传入cookie的key名就可以获取到后面的token了,如:
什么时候可以分享vue获取cookie,如何设置cookie?要设置cookie的文件名cookieUtilsjs/// 设置cookie 名称cookie 值cookie 到期时间cookie /导出常量设置cookie = function(name,value,day) {if (day!== 0) {//当设置的时间等于0时,不设置expires属性,浏览器关闭后cookie删除var curDate = new Date();var curt amp = curdate gettime();var curWeeHours =新日期(curDatetoLocaleDateString())。getTime()-1;var passed tamp = curt amp-curweehors;var left tamp = 24 60 60 1000-passed tamp;var left time = new Date();left time settime(left tamp+curt amp);document cookie = name+" = "+escape(value)+";expires = "+left time togmtstring();} else { document cookie = name+" = "+escape(value);} }/ Get cookie /export const Get cookie = function(name){ var arr;var reg =新RegExp("(^| )" +姓名+" =([^;])(;|$)");if (arr = documentcookiematch(r
首先要了解session是会生成一个session_id,并且通过cookie来存储传输的,当浏览器中存在cookie的时候,每次请求会在请求头header自动带上cookie,如果在请求头看不到coo
因为cookie采取同源策略。Vuex是一个专为Vuejs应用程序开发的 状态管理模式库。它采用集中式存储管理应用的所有组件的状态,vuex中的变量存在cookie里面是因为cookie采取同源策略,只有相同域名的网页才能获取域名对应的cookie,而别人在其他域名无法获取自己的cookie,也就无法获取自己的token。
(如有错误,欢迎指正~~)
在Vue要使用文件上传,找到一个bootstrap编写好的demo,打算直接用,嵌入vue中。demo主要使用jquery和webuploader,jquery和webuploader引用是使用script引入的。要兼容现在的Vue项目。
实验一:
打算在Vue的组件里使用script引入demo里同样引入的文件,发现文件没有被引用进来。
实验二:
打算将script引入文件的语句写成字符串,然后将字符串赋值给Vue组件内的元素的innerHTML里,发现项目报错,原因是innerHTML不允许写入script的内容,百度上说可以使用jquery来实现,试了一下一样不可以。百度一下Vue如何内容HTML,网上说用v-html里面放HTML,然后发现会报同样的错误。
实验三:
前面嵌入HTML文件的内容都失败了,就打算直接嵌入整个HTML文件。可以使用iframe实现内嵌HTML文件,如"<iframe frameborder=”no” style=”width:100%;height:500px;” src=”uploadhtml” ref=”iframe”></iframe>",将uploadhtml文件和内嵌它的Vue文件放在同一个额文件夹下,运行,界面<iframe>内显示"GET NO / uploadhtml",打开浏览器调试器发现,uploadhtml它的读取位置是项目的根目录下,修改src使浏览器可以读到uploadhtml对应的位置。
项目打包发布:
在项目打包发布到服务器的时候发现,使用iframe内嵌的HTML文件报错,由于个人对webpack不熟悉,不知道uploadhtml有没有打包进去。webpack打包HTML文件,在webpackprodconfjs文件中的webpackConfig的pulgins中添加
发现webpack打包文件的时候,会把uploadhtml拎出来放打包下的static文件夹下的upload文件夹,发布服务器的时候发现uploadhtml照样没有显示出来,进入打包后的uploadhtml中,uploadhtml引用js找不到,js应该没有打包进来或者打包进来路径变了。使用important在HTML中引用js文件,打包后发布到服务器还是一样的问题。想着用requirejs去加载HTML,看能不能把HTML和HTML引用的js文件正确打包,由于可以参考内容过少,无从下手。
不打包内嵌HTML了,把uploadhtml及引用文件放在一个文件夹下,加到webpack打包出来的dist的static文件夹下,将webpack中打包 调用uploadhtml路径的js调用路径内容改为在dist对应的路径,发布到服务器上文件终于可以使用了。(现在才想到可以配置webpack将uploadhtml及引用文件从打包独立出来)。
后续:
项目从vue-cli2升级到vue-cli3,之前用的方式不适用了。
vue-cli3用iframe嵌入HTML,HTML要放在public的static文件夹下,在iframe的src调用中,直接写"static/uploadhtml"就可以了。相较于vue-cli2,内嵌的HTML打包后不用上面的笨办法了。
在内嵌的HTML页面,要求与后端的通讯要带上token,试着用js-cookie插件获取当前vue里的token,存入sessionStorage,再在内嵌的HTML页面获取sessionStorage,在本地运行是可以的,打包给后端部署后,在内嵌的HTML获取sessionStorage的值是null,不知道为什么。
后面就在与后端通讯的js里使用jquery-cookie获取token,这个插件是基于jquery的,在引入该文件要先引入jquery
uploaderjs的请求添加请求头参数
以上就是关于解决vue nodejs中cros跨域cookie和session失效的问题全部的内容,包括:解决vue nodejs中cros跨域cookie和session失效的问题、uniapp取cookie缺失、vue项目开发中什么时候用cookie什么时候用sessionstorage等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)