2014-04-03 42 views
2

我有一個簡單的Spring MVC應用程序,它將在用戶執行某些控制器操作後將用戶重定向到新頁面。例如:覆蓋SpringMVC應用程序中的默認重定向URL

@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應用程序運行在具有其他幾個實例的loadbalancer後面。每個都有自己的主機名。負載均衡器配置了SSL,實例不是。

Application Configuration

我想知道什麼是覆蓋默認的重定向行爲的最佳實踐。目前,應用程序以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; 
} 

有沒有更好的方式來覆蓋這個行爲?

回答

1

重定向行爲可以在org.springframework.web.servlet.view.UrlBasedViewResolver找到。您可以通過擴展任何子類或類本身並將其添加到應用程序上下文來輕鬆改變此行爲。

例如,您可以編寫一個特殊的條件,該條件將在重定向視圖名稱中預加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

很好的答案,就是我一直在尋找的!如果其他人實現這一點,稍微糾正一下,REDIRECT_URL_PREFIX已經包含一個「:」,所以不需要添加一個。 – arcdegree

+0

好的。我調整了我的答案是否正確。 – Bart