Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

vue项目,配合signalR实现前置登出功能方案咨询

vue项目,想要实现踢人功能——当前登录用户会踢掉之前登录的账号;
需要满足:
1、同一浏览器多标签可以同时存在(同一用户);
2、跨浏览器不支持,表示多次登录,后面登录的用户挤出前面登录的账户(多个标签都需要收到推送);
实现方式:
在 app.vue 里面初始化signalR,如果是登录或者刷新(重开浏览器页签),则初始化signalR,这个时候就能接收到后台推送的消息了,伪代码如下:

app.vue 文件伪代码:

watch: {
    $route(to, from) {
      if (from.name === "login") { //如果是点击登录按钮登录
        this.signalRInit();
      }
    }
}

mounted() {
    this.setTitle(websitEnv.websiteTitle);
    if (getToken()) { //刷新或者重新开的浏览器页签
      this.signalRInit();
    }
}

  methods: {
    //signalR初始化
    signalRInit() {
      var _this = this;

      var tokens = getToken();
      let baseUrl = "/api/xxx";
      _this.connection = new signalR.HubConnectionBuilder()
        .withUrl(baseUrl, { accessTokenFactory: () => tokens })
        .configureLogging(signalR.LogLevel.Warning) //signalR.LogLevel.Information
        .build();
    }
}

思路:
初始化的时候,前端告诉后台,当前登录(初始化signalR)方式是什么方式——登录刷新(重开标签);如果是前者,表示为第二个用户登录当前账号,后台这需要推送踢人命令;如果是后者,表示是同一个用户的多个浏览器页签或者刷新操作,则不需要踢人;

目前遇到的问题是:在初始化signalR到时候,没办法传递参数,后台不能知道当前初始化(登录)方式,请问大家有什么好建议呢?

谢谢!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

最后采用方式:

当用户调用登录接口时,清空掉当前token(用户名)所存储的所有 链接signalR id,并为这些id对应的用户推送消息;然后接口返回,重新初始化 signalR(重新建立token(用户名) 链接id集合)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...