我们都知道HTTP协议是无状态的。而无状态会导致每次请求都是独立的,没有上下关系,很多时候我们需要一个有状态的连接。这个时候就出现了cookie和session
cookie和session用来保存一些用户信息的,本身不属于HTTP协议,是浏览器和服务端默认实现的。cookie存储于浏览器端,session存放于服务端。当浏览器第一次发送请求时,服务器自动生成了一个Session ID用来唯一标识这个会话,然后把sessionId返回给浏览器,后续的会话中浏览器cookie带上这个sessionId,服务端则识别为这是同一个会话。
再说跨域,跨域源于同源策略,是浏览器的一个安全机制。从一个源加载的文档或者脚本默认不能访问另一个源的资源。例如a.com/111/html页面不能访问b.com/person这种接口,因为他们是不用的源。解决方法有比如设置CORS,或者代理。这里推荐使用代理,CORS处理的不好会导致cookie丢失(比如未指定origin,或者指定为*等等)。
最后说下项目中实际碰到的情况:
前后端分离开发,前端vue,后端springboot。实际开发中很容易会碰到跨域和会话丢失(因为跨域后cookie对应的URL不一致)这两种情况,这种情况可以通过代理来解决这2个问题。
proxyTable: {
'/api':{
target:'http://192.168.11.241:9011/',
changeOrigin:true,
pathRewrite:{
'^/api': '/'
},
cookiePathRewrite:{
'/': '/api'
}
}
}
上面这个配置的意思是,将访问 localhost(vue项目的URL):port/api/下的ajax请求通过代理发送到192.168.11.241:9011/。这样的话,请求和会话实际是浏览器端和前端服务器之间的,不涉及跨域。而前端又做了处理,将Ajax请求以及cookie代理发送到后端服务器,这样就避免了上面出现的两种情况。