登录态共享
登录态共享?什么鬼,不知道的就可以不用看啦,需要时再说,说不定到时也用不到,笑脸~~
场景
解决多个子系统中共用模块(比方说工单系统)可以共享子系统的登录态
为简化问题,设定场景:
登录系统A,点工单操作跳转系统B,并且无需登录(至于系统登录何时失效暂不考虑)
还有:别问我为什么不用单点登录(SSO),那个,不想说,笑脸~~
先别废话,直接代码上
系统A
跳转自动登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var taskApi='http://localhost:10100/'; $.ajax({ url: taskApi+'login', type: "post", dataType: "json", data: { username:'newbmiao', refer:location.href, }, xhrFields: { withCredentials: true }, success: function (res) { console.log(res); } });
|
工单系统B
登录逻辑
不用想的是,接到username,校验是管理员等等,ok的话设置到session返回给系统A
有人想到Access-Control-Allow-Origin
了,就是这个
- 问题2:服务器B
session
设置没问题,怎么系统A能拿到session
的cookie
?拿到了再请求服务器B,cookie
能拿到么?
好问题,还是cors解决了,不过这个是双向的
就是客户端说:我请求会带你给我的cookie,服务器说:我也允许读取你传递的cookie
当然不是什么cookie都能回传,只能是系统B设置的cookie(而且系统B其实能设置成功的话,也必须将Access-Control-Allow-Origin
明确指定为系统A)
有没有晕,多读几遍就好了
附文一篇巩固下:跨域资源共享CORS详解
思路对了,最后就是就是怎么按cors设置了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
func InArray(val string, array []string) (exists bool, index int) { exists = false index = -1; for i, v := range array { if val == v { index = i exists = true return } } return }
func (c *BaseController) addAccessControlHeader() { r := c.Ctx.Request w := c.Ctx.ResponseWriter originUrls:= "http://shop.laradock.dev/,http://another-shop.laradock.dev/" originArr := strings.Split(originUrls, ",") Origin := r.Header.Get("Origin") if 0 != len(Origin) { isExist, index := help.InArray(Origin, originArr) if !isExist { c.echoJson("请求未授权", nil, 1) } w.Header().Add("Access-Control-Allow-Origin", originArr[index]) w.Header().Add("Access-Control-Allow-Methods", "POST,GET,OPTIONS") w.Header().Add("Access-Control-Allow-Headers", "x-requested-with,content-type") w.Header().Add("Access-Control-Allow-Credentials", "true") } }
func (c *BaseController) echoJson(data interface{}, msg string, code int) map[string]interface{} { c.addAccessControlHeader() ret := make(map[string]interface{}) ret["data"] = data ret["msg"] = msg ret["code"] = code c.Data["json"] = ret c.ServeJSON() }
|
完结
题外话,go很不错,只是还没玩明白啊,继续挖坑
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com
本文链接 : https://newbmiao.github.io/2017/05/16/share-the-login-status-under-cors.html