跨域登录态共享

文章目录

  1. 1. 登录态共享
    1. 1.1. 场景
    2. 1.2. 系统A
      1. 1.2.1. 跳转自动登录
    3. 1.3. 工单系统B
      1. 1.3.1. 登录逻辑
    4. 1.4. 完结

登录态共享

登录态共享?什么鬼,不知道的就可以不用看啦,需要时再说,说不定到时也用不到,笑脸~~

场景

解决多个子系统中共用模块(比方说工单系统)可以共享子系统的登录态
为简化问题,设定场景:
登录系统A,点工单操作跳转系统B,并且无需登录(至于系统登录何时失效暂不考虑)

还有:别问我为什么不用单点登录(SSO),那个,不想说,笑脸~~

先别废话,直接代码上

系统A

跳转自动登录


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//假定在 http://shop.laradock.dev/ 点击工单button执行
var taskApi='http://localhost:10100/';//工单系统地址
$.ajax({
url: taskApi+'login',
type: "post",
dataType: "json",
data: {
username:'newbmiao',//账户唯一标识
refer:location.href,//可用于工单系统跳回A使用
},
xhrFields: {
withCredentials: true //大招在这里
},
success: function (res) {
console.log(res);
//自动登录成功后跳转(什么?已经登陆了?!)
//location.href=taskApi;
}
});

工单系统B

登录逻辑

不用想的是,接到username,校验是管理员等等,ok的话设置到session返回给系统A

  • 问题1:系统A怎么跨域请求

有人想到Access-Control-Allow-Origin了,就是这个

  • 问题2:服务器Bsession设置没问题,怎么系统A能拿到sessioncookie ?拿到了再请求服务器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
//按go (beego) 代码写的,但很简单,相信能看懂
//看不懂,好吧,请喷吧,笑脸~~

//in_array
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")
}
}
//json输出
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