Как я могу перенаправить на страницу с ошибкой в ​​моем приложении Play?

Или точнее...

У меня уже есть маршрут страницы с ошибкой, определенный следующим образом:

GET  /error  controllers.pages.ErrorController.page(msg: String, returnTo: String)

И такой метод контроллера:

object ErrorController extends Controller {
  def page(msg: String, returnTo: String) = ReceiverRestricted { implicit req =>
    val action = List(Button(F8, "Continue", Call("GET", returnTo)))
    Results.Ok(views.html.base(Html("Oops"), List(Html(msg)), None, action))
  }
}

Если я программно вызываю, скажем, ErrorController.page("You did something daft!", "/home"), я попадаю на страницу, которая выглядит так, как я хочу, т.е.:

Oops
You did something daft!
F8 Continue

Однако URL-адрес уродлив:

http://localhost:9000/error?msg=You%20did%20something%20daft!&returnTo=/home

Я хочу изменить это, чтобы параметр запроса msg= не отображался в URL-адресе. Как я могу это сделать? Я попытался удалить параметр запроса и перенаправить на страницу ошибки с сообщением, переданным через флэш-куки, - это сработало, но при перезагрузке страницы браузера сообщение теряется. Я не могу использовать файл cookie сеанса, потому что я уже храню другие данные в сеансе почти до предела.


person Vik Shah    schedule 09.06.2015    source источник


Ответы (2)


Вы можете использовать функцию вспышки. Вот пример: в вашем контроллере вы можете перенаправить пользователя на страницу ошибки с помощью:

  Redirect("/error").flashing(
    "reason" -> "The item has been created"
  )

И в действии ошибки:

def error = Action { implicit request =>
  Ok {
      val reason =     flash.get("reason").getOrElse("General Error")
      //DO your stuff with reason variable
  }
}

Очевидно, что вы можете иметь столько flash-переменных, сколько захотите.

person Soroosh Sarabadani    schedule 09.06.2015
comment
Если я могу прояснить одну деталь, вы можете иметь столько flash-переменных, сколько хотите, однако они находятся в файле cookie, размер которого ограничен 4 КБ. Это использование функции вспышки на 100% правильно, просто знайте ограничения и старайтесь не злоупотреблять ею. - person Krystian Laskowski; 09.06.2015
comment
Спасибо - я уже пробовал это, как я упомянул в нижней части моего поста: я попытался удалить параметр запроса и перенаправить на страницу ошибки с сообщением, переданным через флэш-куки - это сработало, но перезагрузка страницы браузера теряет сообщение. У вас есть обходной путь для этой проблемы? - person Vik Shah; 10.06.2015

Поскольку Play является спокойным и не имеет состояния, я не вижу простого способа передать сообщение об ошибке во время перенаправления без использования флэш-памяти Play. Конечно, вы можете сохранить сообщение во временном файле cookie в браузере. Другая возможность может состоять в том, чтобы сохранить его в вашей базе данных (или в любой другой технологии сохраняемости, которую вы используете), но это похоже на раскалывание ореха кувалдой.

person Kris    schedule 10.06.2015