我有一个简单的Spring MVC应用程序,它会在某些控制器操作后将用户重定向到新页面。例如:
@Controller
public class ResponseController {
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveObj(HttpServletRequest request, @ModelAttribute(“someObject”) Object obj) {
// logic to validate and save object
return "redirect:/obj/" + id;
}
}
这个Spring MVC应用程序在带有其他几个实例的负载均衡器后面运行。每个都有自己的主机名。负载均衡器配置了SSL,实例不是。
我想知道的是覆盖默认重定向行为的最佳做法。目前,应用程序以https://mysite.com开头,但在用户执行需要重定向的操作后,应用程序会将用户重定向到http://some.hostnameX.com。
目前,我有一个用于帮助用户重定向到mysite.com的属性。
loadbalancer.url=https://mysite.com
然后,在控制器中,我有以下内容:
@Value("loadbalancer.url")
String loadbalanerUrl;
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveObj(HttpServletRequest request, @ModelAttribute(“someObject”) Object obj){
// logic to validate and save object
return "redirect:" + loadbalancerUrl + "/obj/" + id;
}
有没有更好的方法来覆盖此行为?
答案 0 :(得分:1)
可以在org.springframework.web.servlet.view.UrlBasedViewResolver
中找到重定向行为。您可以通过扩展任何子类或类本身并将其添加到应用程序上下文来轻松地更改此行为。
例如,您可以编写一个特殊条件,该URL将在重定向视图名称中添加url。它将无需手动完成。
public class CustomUrlBasedViewResolver extends UrlBasedViewResolver {
@Value("${loadbalancer.url}")
private String loadBalancerUrl;
@Override
protected View createView(String viewName, Locale locale) throws Exception {
if (viewName.startsWith(super.REDIRECT_URL_PREFIX)) {
String url = viewName.substring(REDIRECT_URL_PREFIX.length());
String loadBalancedViewName = super.REDIRECT_URL_PREFIX + loadBalancerUrl + url;
return super.createView(loadBalancedViewName, locale);
}
return super.createView(viewName, locale);
}
}
答案 1 :(得分:1)
您还可以在每个实例上(在它们自己的app.properties
或app.yml
中进行设置)
server.use-forward-headers=true
执行HttpServletRequest
对象将获得负载均衡器主机及其端口。