Get absolute URL of site Grails application is available at?
Many times, we need to get the absolute URL of the site/application. One such case is when we are sending out links to the application in emails.
The default Config.groovy file provided by Grails has a property with the name grails.serverURL. I have typically used it to get absolute URL (environment specific) of the site Grails application is available at.
This approach breaks in case the application is available as different sites i.e. the same application is used to render multiple sites. Here we need to get the absolute URL of the site that is serving the request (instead of application wide URL).
We could use inject a utility method to HttpServletRequest class (similar to isXhr method injected by Grails in the same class)
[groovy]
javax.servlet.http.HttpServletRequest.metaClass.getSiteUrl = {
return (delegate.scheme + "://" + delegate.serverName + ":" + delegate.serverPort + delegate.getContextPath())
}
[/groovy]
After we do this, we could simply say request.siteUrl to get the absolute URL of the site serving the request. You might want to get rid of serverPort in the above method if the server is running on standard HTTP ports (80/443).
Hope you find it handy!
-Deepak
Nice! Great job!
Thanks, just what I was looking for too! Power of meta programming.
When I am using
delegate.scheme + “://” + delegate.serverName + “:” + delegate.serverPort + delegate.getContextPath()
we have apache which is reroute the request to tomcat
will give url with war file name
for e.g
https://websitename:443/warFileName/….
how can i get rid of warFileName
Hi Josh,
You can use Bootstrap.groovy for this purpose instead of injecting the dynamic method each time a filter is called.
Needed this for a project, I ended up creating a Filter to do it for all controllers:
class SiteChooserFilters {
def filters = {
all(controller:’*’, action:’*’) {
before = {
javax.servlet.http.HttpServletRequest.metaClass.getSiteUrl = {
return (delegate.scheme + “://” + delegate.serverName + “:” + delegate.serverPort + delegate.getContextPath())
}
}
}
}
}
Thank You!
Just what I was looking for!
Thanks!