如何在自定义方法中调用session
发布于 2 年前 作者 charmfocus 1018 次浏览 来自 问答

官方示例中有一个login模块,但login模块是以mqtt客户端进行socket连接后调用的,因为我们需要通过http方式进行登录处理,所以在login模块中实现了一个http服务,在其handler中进行用户名和密码验证,然后再通过rpc调用HD_Login进行登录处理,其中有一个session这个参数需要传递,但这个session如何才能拿到?或有别的办法解决这个问题? 例: func (m *Login) loginHandler(ctx *fasthttp.RequestCtx) { data := ctx.PostBody() json := jsoniter.ConfigCompatibleWithStandardLibrary var toData map[string]interface{} err := json.Unmarshal(data, &toData) if err != nil { ctx.Error(“post data is error!”, fasthttp.StatusNotFound) return } m.RpcInvoke(“Login”, “HD_Login”, session, toData) }

6 回复

你这个需求我现在也用到了,我这里是这样处理的 RPC接口分两类

  1. 一类是后端模块相互调用的没有HD_开头,也不强制要求有session
  2. 客户端调用的接口HD_开头

web访问的属于内部rpc调用我就session传空

m.RpcInvoke(“Login”, "Login", nil, user,passwd)

QB20171017-1.png

可是如果rpc调用的方法里需要用session处理用户绑定,这时rpc传入的session为nil时,应该是在调用方法里无法进行bind动作的吧,如果是这样,那意味着传入的session为nil时,无法使用session功能: RPC调用:

m.RpcInvoke(“Login”, “Login”, nil, toData)

被调用的方法:

func (m *Login) login(session gate.Session, msg map[string]interface{}) (result string, err string) { if msg[“userName”] == nil || msg[“passWord”] == nil { result = “userName or passWord cannot be nil” return } userName := msg[“userName”].(string) err = session.Bind(userName) if err != “” { return } session.Set(“login”, “true”) session.Push() //推送到网关 session.Send(“login”, []byte("{“status”:1}")) return fmt.Sprintf(“login success %s”, userName), “” }

你考虑的这个问题本身就不存在,session只在tcp长连接里面有,http请求根本就没有。所以你要做的后端RPC模块 Login根本就不需要做session绑定这个功能。

session绑定这个功能应该在HD_Login这个模块做,而HD_Login这个模块应该调用Login模块做用户验证

也就是说Login模块只负责用户登录验证,返回用户信息,这个模块可以让 HTTP和TCP长连接两个模块来调用

而你说的session绑定只需要在HD_Login里面进行绑定即可

OK,明白了~ 其实我想调用session,主要是想让session做持久化,session在redis中做存储。 这样我理解了,http的Login方法中只做验证,并单独把session持久化独立出来,并提供给Login直接调用即可

不是session持久化提供给Login调用,而是gate tcp网关用户登录的时候调用Login,并且gate tcp网关里面做session持久化即可。 你每个模块的功能范围总得划分清楚吧,比如代码就一团糟

gate模块有一个接口可以用来做session持久化 gate模块

好的,理解了~

回到顶部