Spring MVC (3.0) considers URLs with and without trailing slashes as the same URL.
For example:
http://www.example.org/data/something = http://www.example.org/data/something/
I need to redirect the URL with trailing slashes
to the URL without it:
I need to do this internally the application (so not rewrite rules via Apache, etc).
A way to do it is:
@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
@RequestMapping(value = "/data/something/")
public String dataSomethingRedirect(...) {
return "redirect:/data/something";
}
but this has generally 2 problems:
- too many controllers
- problem with parameters: like wrong encoding
Question
Is there a way to intercept all the URLs and in case they have a trailing slash, redirect them to the relative one without slash?
You could list all the rewrite rules you need in your web configuration
If there aren't many of those, you can configure redirect views like this
Or you could create a custom HandlerInterceptor
But interceptors occur before requests are mapped to a specific
Controller.action
and you've got no way of knowing Controllers and actions in that context.All you've got is HTTPServlet API and request+response; so you can:
The answer you don't want to read
This behavior (URL with trailing slash = URL without it) is perfectly "valid" when considering HTTP. At least this is the default behavior with Spring, that you can disable with
useTrailingSlashMatch
(see javadoc).So using rewrite/redirect rules on the front-end server could a solution; but again, I don't know your constraints (maybe you could elaborate on this and we could figure out other solutions?).