我有一个用revel框架制作的golang web应用程序。我在登录后面临重定向到上一页的问题。我有几页用户应该登录以查看内容。如果用户未登录,我已成功重定向到登录页面。以下是我的代码片段:
func checkUser(c *revel.Controller) revel.Result {
if _, ok := c.Session["user"]; ok {
return nil
}
var cont = c.Request.RequestURI
fmt.Printf("Requesting URL : ", cont)
return c.Redirect(LoginApp.Login, cont)
}
func init() {
revel.InterceptFunc(checkUser, revel.BEFORE, &App{})
}
这是我的app.go
type App struct {
*revel.Controller
}
func (c App) Application() revel.Result {
var app = make(map[string]string)
app["appTitle"] = "Hourglass"
app["ngApp"] = "app"
app["theme"] = "dark"
app["ngController"] = "ApplicationController"
return c.Render(app)
}
func (c App) Test() revel.Result {
var app = make(map[string]string)
app["appTitle"] = "Hourglass"
app["ngApp"] = "app"
app["theme"] = "dark"
app["ngController"] = "ApplicationController"
return c.Render(app)
}
现在我有一个login.go文件,其中包含 ServiceLogin 方法
func (c LoginApp) ServiceLogin(user models.User) revel.Result {
username := user.UserName
password := user.Password
fmt.Printf("", username)
fmt.Printf("", password)
sess := service.GetSession()
usercoll := sess.DB("hourglass_dev").C("user")
var result models.User
var err = usercoll.Find(bson.M{"UserName": username, "Password": password}).One(&result)
fmt.Printf("", result)
fmt.Printf("", c.Request.RequestURI)
if err != nil {
fmt.Printf("", err)
}
//var app := make(map[string]string)
//return c.Render(app)
c.Session["user"] = username
return c.Redirect(App.Application)
}
现在在方法的最后一行,我必须硬编码 App.Application ,而不是我想要使用请求的URL,以便当用户成功登录时,它会自动重定向到他们要求的页面。
答案 0 :(得分:1)
您可以做一些事情:
您可以在请求中使用标头的referer field并重定向回那里。我不知道referer字段有多可靠,所以我不认为我会自己使用这种技术,但它很容易,所以根据你的用例,它可能已经足够好了。在狂欢中,您将使用以下内容访问引用者:
c.Request.Header["referer"].Get()
您可以将要重定向到的原始链接存储在数据库中,并将该链接与您正在使用的会话ID相关联。 Revel没有附带数据库,但它带有可能有效的内存缓存。
您可以将链接存储在客户端的cookie中。我从来没有这样做,所以我不确定你需要考虑什么,但我相信它会起作用。
您可以通过请求参数将链接传递给流程中的每个URL。这项技术需要记住一些事项,包括安全性,url转义等等,但这种技术有一些优点,例如不需要数据库访问。您的网址如下所示:
http://www.example.com/loginurl?redirecturl=[someurl]