You can achieve that using an HandlerInterceptor :
The interceptor will check if the request URI ends with a slash.
If it does, the request is processed, if not, the response is redirected with the same URI with a trailing slash.
In the example below, I ignore requests with a query string, since I don't kow how you want to handle this case.
The interceptor :
@Component
public class TrailingSlashInterceptor extends HandlerInterceptorAdapter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(StringUtils.isBlank(request.getQueryString()) && !request.getRequestURI().endsWith("/")) {
response.sendRedirect(request.getRequestURL().append("/").toString());
return false;
}
return true;
}
}
Register and map the interceptor in your config :
@Autowired
private TrailingSlashInterceptor trailingSlashInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(trailingSlashInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/static/**");
}
I noticed that in your JSP, if you have some, you have to make URL start with a slash eg: <c:url value="/clients" />
Using this method, all requests that have no trailing slash will be temporary redirected (302) toward the same URI with a trailing slash.