Reputation: 2592
Given this methodology of relative redirect to another controller:
@Controller
@RequestMapping("/someController")
public class MyController {
@RequestMapping("/redirme")
public String processForm(ModelMap model) {
return "redirect:/someController/somePage";
}
}
How can I simulate that same relative redirect given that I'm within an interceptor?
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
response.sendRedirect("/someController/somePage");
return false;
}
}
Now with the interceptor, i will end up at application.com/someController/somePage when I really want to be at application.com/deployment/someController/somePage. Surely there must be a 'spring' solution for this?
Upvotes: 5
Views: 20159
Reputation: 18304
As recommended by an answer to the more recent question Context path with url-pattern redirect in spring, you could use ServletUriComponentsBuilder
Upvotes: 0
Reputation: 5516
Converting my comment to an answer -
Try using response.sendRedirect(request.getContextPath() + uri);
Upvotes: 15
Reputation: 2592
After referencing the redirect documentation,reviewing the source code for UrlBasedViewResolver, and gotuskar's comment, I feel silly for not knowing this would work and have a solution:
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
StringBuilder targetUrl = new StringBuilder();
if (this.redirectURL.startsWith("/")) {
// Do not apply context path to relative URLs.
targetUrl.append(request.getContextPath());
}
targetUrl.append(this.redirectURL);
if(logger.isDebugEnabled()) {
logger.debug("Redirecting to: " + targetUrl.toString());
}
response.sendRedirect(targetUrl.toString());
return false;
}
}
Upvotes: 1