Перенаправление на предыдущий URL-адрес после входа в систему с помощью Revel

У меня есть веб-приложение golang, созданное с помощью фреймворка Revel. Я столкнулся с проблемой перенаправления на предыдущую страницу после входа в систему. У меня есть несколько страниц, на которых пользователи должны войти в систему для просмотра содержимого. Я успешно перенаправил на страницу входа, если пользователи не вошли в систему. Вот мой фрагмент кода ниже:

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-адрес, чтобы, когда пользователь успешно вошел в систему, он автоматически перенаправлял на страницу, которую они просят о.


person Arpan Mukhopadhyay    schedule 07.08.2016    source источник


Ответы (1)


Вот несколько вещей, которые вы можете сделать:

  • Вы можете использовать поле реферера в заголовке запроса и перенаправить туда. Я не знаю, насколько надежно поле реферера, поэтому я не думаю, что буду использовать этот метод сам, но он прост, поэтому в зависимости от вашего варианта использования он может быть достаточно хорошим. В Revel вы могли бы получить доступ к рефереру примерно так:

    c.Request.Header["referer"].Get()
    
  • Вы можете сохранить исходную ссылку, на которую хотите перенаправить, в базе данных и связать эту ссылку с идентификатором сеанса, который вы уже используете. Revel не поставляется с базой данных, но имеет кэш в памяти, который может работать.

  • Вы можете сохранить ссылку в файле cookie на клиенте. Я никогда этого не делаю, поэтому я не совсем уверен, что вам нужно об этом думать, но я верю, что это сработает.

  • Вы можете передать ссылку на каждый URL-адрес в процессе через параметры запроса. При использовании этого метода следует помнить о нескольких вещах, включая безопасность, экранирование URL-адресов и т. д., но этот метод имеет некоторые преимущества, например, не требует доступа к базе данных. Ваши URL-адреса будут выглядеть примерно так:

    http://www.example.com/loginurl?redirecturl=[someurl]
    
person Bjorn Roche    schedule 22.09.2016