Authentication 使用Revel登录后重定向到上一个URL

Authentication 使用Revel登录后重定向到上一个URL,authentication,revel,Authentication,Revel,我有一个使用revel框架制作的golang web应用程序。我在登录后重定向到上一页时遇到问题。我有几个页面,用户应该登录以查看内容。如果用户未登录,我已成功重定向到登录页面。下面是我的代码片段: func checkUser(c*revel.Controller)revel.Result{ 如果,ok:=c.Session[“user”];ok{ 归零 } var cont=c.Request.RequestURI Printf(“请求URL:,续) 返回c.Redirect(LoginAp

我有一个使用revel框架制作的golang web应用程序。我在登录后重定向到上一页时遇到问题。我有几个页面,用户应该登录以查看内容。如果用户未登录,我已成功重定向到登录页面。下面是我的代码片段:

func checkUser(c*revel.Controller)revel.Result{
如果,ok:=c.Session[“user”];ok{
归零
}
var cont=c.Request.RequestURI
Printf(“请求URL:,续)
返回c.Redirect(LoginApp.Login,cont)
}
func init(){
revel.InterceptFunc(checkUser、revel.BEFORE和App{})
}
这是我的应用程序

类型App struct{
*狂欢节控制器
}
func(c应用程序)应用程序()revel.Result{
var app=make(映射[字符串]字符串)
应用程序[“appTitle”]=“沙漏”
应用程序[“ngApp”]=“应用程序”
应用程序[“主题”]=“黑色”
应用程序[“ngController”]=“ApplicationController”
返回c.Render(应用程序)
}
函数(c应用程序)测试()相关结果{
var app=make(映射[字符串]字符串)
应用程序[“appTitle”]=“沙漏”
应用程序[“ngApp”]=“应用程序”
应用程序[“主题”]=“黑色”
应用程序[“ngController”]=“ApplicationController”
返回c.Render(应用程序)
}
现在我有了一个login.go文件,其中包含一个ServiceLogin方法

func(c LoginApp)ServiceLogin(user models.user)revel.Result{
用户名:=user.username
密码:=用户。密码
fmt.Printf(“,用户名)
fmt.Printf(“,密码)
sess:=service.GetSession()
usercoll:=sess.DB(“沙漏开发”).C(“用户”)
var结果模型。用户
var err=usercoll.Find(bson.M{“UserName”:UserName,“Password”:Password})
fmt.Printf(“,结果)
fmt.Printf(“,c.Request.RequestURI)
如果错误!=零{
fmt.Printf(“,err)
}
//var-app:=make(映射[字符串]字符串)
//返回c.Render(应用程序)
c、 会话[“用户”]=用户名
返回c.Redirect(应用程序)
}

现在,在方法的最后一行,我必须硬编码应用程序,而不是使用请求URL,这样当用户成功登录时,它会自动重定向到他们请求的页面。

您可以做以下几件事:

  • 您可以在请求中使用头的名称并重定向回那里。我不知道referer字段有多可靠,所以我不认为我自己会使用这种技术,但它很简单,所以根据您的用例,它可能足够好了。在revel中,您可以通过以下方式访问referer:

    c.Request.Header["referer"].Get()
    
    http://www.example.com/loginurl?redirecturl=[someurl]
    
  • 您可以将要重定向到的原始链接存储在数据库中,并将该链接与您已经使用的会话id相关联。Revel并没有附带数据库,但它确实附带了一个内存缓存,可以正常工作

  • 您可以将链接存储在客户端的cookie中。我从来没有这样做过,所以我不确定你需要考虑什么,但我相信它会起作用

  • 您可以通过请求参数将链接传递到流程中的每个URL。使用这种技术需要记住一些事情,包括安全性、url转义等,但是这种技术有一些优点,例如不需要访问数据库。您的URL将如下所示:

    c.Request.Header["referer"].Get()
    
    http://www.example.com/loginurl?redirecturl=[someurl]