2014-04-03 5 views
2

특정 컨트롤러 동작 후에 사용자를 새로운 페이지로 리다이렉트하는 간단한 스프링 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; 
    } 
} 

이 스프링 MVC 애플리케이션은 다른 여러 인스턴스가있는로드 밸런서 뒤에 있습니다. 각 호스트에는 고유 한 호스트 이름이 있습니다. 로드 밸런서는 SSL로 구성되며 인스턴스는 그렇지 않습니다. 내가 알고 싶은 무엇

Application Configuration

기본 리디렉션 동작을 재정의하는 가장 좋은 방법입니다. 현재 응용 프로그램은 https://mysite.com으로 시작하지만 사용자가 리디렉션이 필요한 작업을 수행하면 응용 프로그램이 사용자를 http://some.hostnameX.com으로 리디렉션합니다.

현재 저는 사용자를 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; 
} 

이 동작을 재정의하는 더 나은 방법이 있나요 :

loadbalancer.url=https://mysite.com 

그런 다음 컨트롤러에서, 나는 다음 있나요?

답변

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

관련 문제