之前做了一个前后台分离的项目,发现session出现跨域的问题,这个时候在网上找了很多资料和帖子,多数帖子都是人云亦云,你一嘴,我一嘴的,但是看的多了之后也就明白了。
- CORS全称Cross-Origin Resource
Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问的那个资源就会遇到跨域问题。 - 我们知道前后台分离,顾名思义就是前台一个服务器,后台一个服务器这样做有几个好处
- 减轻动态服务器的压力,将静态内容分离出来,术业有专攻,让专业的服务器干专业的事
- 摆脱了后台既当爹又当妈的现状,让后台专心的写后台的框架和业务层的开发,进行更精准的单元测试
- 项目解耦,后台有bug启后台,前台有bug启前台
所以现状依然有些公司在使用前后台分离的技术,我使用的中间件是node.js,现在多数人已经不用它了,因为有一个更轻便和高效的中间件就是negix(有时间我会写一个negix的帖子)
使用前后台分离的好处显而易见,但是在实际开发时,我相信许多人跟我遇到过一个同样的问题session失效了,因为session的作用域是服务器,而不是全局,所以这个时候我们就不能用session来会话跟踪与控制了 可以使用cookie
首先我们要知道什么是Cookie?他的作用和用途?
- Cookie是存储在用户计算机上的小文件,保存特定客户端和网站的适量数据,并可以由Web服务器或客户端浏览器访问,允许服务器提供针对特定用户定制的页面,或者页面本身可以包含一些知道cookie中的数据的脚本。
- 作用:可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。
- 用途: 存储用户在特定网站上的密码和 ID。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将利用计算机硬驱上的少量空间来储存这些首选项。这样,每次登录该网站时,浏览器将检查有无cookie。如果有,浏览器将此 cookie 随网页的请求一起发送给服务器。
- Cookie的应用场景:假设你某次登录过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取Cookie里面的信息,就自动帮你把用户名和密码填了,能够方便用户。这也是Cookie名称的由来,给用户的一点甜头。
什么是session?
- Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
- Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当 Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择
session的工作原理
(1)当有Session启动时,服务器生成一个唯一值,称为Session ID(好像是通过取进程ID的方式取得的)。
(2)然后,服务器开辟一块内存,对应于该Session ID。
(3)服务器再将该Session ID写入浏览器的cookie。
(4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放改内存块。
(5)当浏览器连入IIS时并请求的ASP内用到Session时,IIS就读浏览器Cookie中的Session ID。
(6)然后,服务检查该Session ID所对应的内存是否有效。
(7)如果有效,就读出内存中的值。
(8)如果无效,就建立新的Session。
cookie前台的代码
//存入cookie name为用于会话跟踪 密钥用于登陆状态
document.cookie="name="+name;
//获取cookie
var name=document.cookie.split(";")[0].split("=")[1];
alert(name)
使用cookie就可以解决session失效的问题了,cookie里存用于会话跟踪的数据和密钥最后与后台进行比较 或者你觉的cookie不安全可以试着cookie和session一起用,传值的时候把cookie加密到后台进行后台解析然后同时存入session中,这样就完美的解决跨域问题了