slouc
slouc

Reputation: 93

Refreshing a page with cookies in Play

I have a drop-down selection of available languages. Currently, clicking on a language is mapped to a method in controller which updates the Play Session (which is a cookie under the hood) with the selected language and returns index page.

View:

<a href="@routes.Application.setLanguage("en")">English</a>

Controller:

def setLanguage(language: String): Action[AnyContent] = Action { implicit request =>
  val updatedSession = request.session + (("lang", language))
  Redirect(routes.Application.index()).withSession(updatedSession)
}

As you can see, I redirect to index page and it's working fine. However, as the language selection is available at all times on my page, it may be clicked from /resource1, /resource2, /resource3 etc. and I would like to refresh that particular view instead of being returned to home page. I cannot simply get request.uri in the controller and refresh whatever it's pointing to because setLanguage() is mapped to its own route, so my request URI is always /language?lang=whatever.

So, how do I know that prior to invoking GET on /language, client was on, say, /items so I can reload items page instead of returning him to home page? Should I send a GET request with resource as a parameter (e.g. ?lang=en&location=items) to know which page to render? Should I make an ajax request and call window.location.reload() on success? Do I even need to go to server or can I simply update the PLAY_SESSION cookie manually from the client?

I'm using Play 2.3.7.

Upvotes: 1

Views: 402

Answers (2)

Sebastien Lorber
Sebastien Lorber

Reputation: 92140

There is an HTTP header called Referer that contains the url from which the request was made. As far as I know it's supported and used by all modern browsers when you navigate from a page to another. You can simply redirect to that Referer url.

Another solution is to track in a session or a cookie all pages that are accessed by an user, by using some kind of interceptor in Global.scala or a custom Action builder that you use everywhere. Then in case of language change you can simply redirect to the last page that was accessed by the user.

Upvotes: 1

thwiegan
thwiegan

Reputation: 2173

No you cannot update the PLAY_SESSION cookie from the client side, since it is signed by play with the application secret.

So I think the easiest solution would be, as suggested, to send the current resource as parameter and trigger a redirect.

Upvotes: 1

Related Questions