0

我正在使用 revel 实现一个简单的拦截器,他的唯一责任是确保用户经过身份验证,如果没有,则重定向到身份验证页面。我有一些大意

func setUser(c *revel.Controller) revel.Result {
    switch interface{}(c.Type).(type) {
    case controllers.Auth:
        return nil
    }
    return c.Redirect(controllers.Auth.Index)
}

从未遇到过类型案例controllers.Auth,从而有效地导致了无限循环。我假设我缺少一些明显的东西,但是当我弄清楚如何通过 gdb 运行一个 revel 应用程序来尝试调试它时,我想我会在这里问。

4

1 回答 1

2

我相信对于您的开关,您需要一个基本案例。你最终会无限地陷入其中,因为 c 的类型不是controllers.Auth,而且你没有其他情况。但是,在您的用例中,没有理由使用开关,我个人也不会。它是二进制的,所以只需键入 assert on controllers.Auth,如果不是,则重定向。

func setUser(c *revel.Controller) revel.Result {
    if _, ok := c.(controllers.Auth); ok {
             return c.Redirect(controllers.Auth.Index)   
    }
    return nil
}
于 2016-01-18T20:53:04.917 回答