2011-01-02 5 views
18

URL을 단축해야하는 애플리케이션이 있지만 다른 작업을 수행한다고 가정 해 보겠습니다. (예 : google.comgoo.gl 또는 facebook.comfb.me).spring mvc을 사용하는 다중 도메인

단순히 두 개의 응용 프로그램을 배포하는 것이 쉽지만 (지금은) 단지 하나의 응용 프로그램으로 만드는 것이 더 쉽습니다. 스프링 및 스프링 -mvc 사용. 나는 다음과 같은 매핑이 있습니다

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") 
... 
@RequestMapping(value="/{username}") 

아아을의 headers 주석,보다 구체적인 정보를 제공으로 대신 제한으로하지 역할을합니다. 따라서이 두 개가 있으면 http://foo.br/asdf으로 열어도 후자 만 호출됩니다. 이전 버전 만 남기면 foo.br에서 오는 서버에서 작동하며 호스트가 다른 경우 아무 것도 열지 않습니다.

그래서, 질문 :

  • 는 어떻게 같은 경로에 대한 두 개의 핸들러를 만들 수 있지만, 다른 URL/호스트
  • 오히려 (속성 자리 구성 장치로, 동적 호스트를 해결 할 수 있습니다 주석에서 하드 코딩하는 것보다)

아마도 메소드 확인을위한 플러그 가능한 메커니즘이 있으면 둘 다 작동합니다. 그런가요?

+0

([여러 도메인 및 하위 도메인 관리] http://technology.sravi.com/2011/05/managing-multiple-domain-and : 각 도메인 헤더 매핑이 컨트롤러 방법을 가질 수처럼 ounds -sub-domain.html) – Lucky

답변

15

즉각적인 제안은 서블릿 필터 (또는 스프링 HandlerInterceptor)를 작성하는 것입니다. 서블릿 필터 (또는 스프링 HandlerInterceptor)는 요청에서 호스트 이름을 가져 와서 원래 요구 된 경로 앞에 추가 한 다음 요청을 전달합니다.

예를 들어 요청 된 URL이 http://goo.gl/my/path 인 경우 필터는 /goo.gl/my/path으로 전달됩니다. 스프링 MVC 맵핑은 그로부터 치아를 가져올 것이다.

또는 필터는 요청한 호스트를 포함하는 사용자 지정 헤더 또는 요청 특성을 설정할 수 있지만 유연성이 떨어질 수 있습니다. 예를 들어, 다음과 같은 앤티 스타일 와일드 카드 구문 (예 : "**/my/path") 또는 경로 변수 스타일이 유용 할 수 있습니다.

난 당신이 생각, 질문의 두 번째 부분 무슨 뜻인지 모르겠어요 여기

는 작업 조각의 :. 당신의 설명을 바탕으로

@Override 
public boolean preHandle(HttpServletRequest request, 
     HttpServletResponse response, Object handler) throws Exception { 

    if (request.getRequestURL().toString().contains(shortenerDomain) 
      && !request.getRequestURI().startsWith(SHORT_URI_PREFIX)) { 

     request.getRequestDispatcher(SHORT_URI_PREFIX + request.getRequestURI()) 
       .forward(request, response); 
     return false; 
    } else { 
     return true; 
    } 
} 
+0

아주 좋은 생각 :) 2 번째 질문은 짧은 호스트 이름을 하드 코딩하는 것이 아니라 구성하는 것이 었습니다. 그러나 당신의 제안은 그것도 수정합니다 (나는 인터셉터에'@ Value'를 주입 할 것입니다). 그것을 시도하고, 그 대답을 수락 할 것이다 – Bozho

+1

작품 :) 코드 스 니펫을 추가했습니다. (getHeader ("Host")를 사용할 수는 있지만 차이는 없습니다.) – Bozho

2

, 그것이야

@RequestMapping(value="/{shortUrlKey}", headers="Host=foo.br") 
public void fooBr() { ... } 

@RequestMapping(value="/{shortUrlKey}", headers="Host=bar.bz") 
public void barBz() { ... } 
+0

그럴 거라고 생각했는데 아마도 작동 할 것이기 때문에 (+1), 내 호스트를 하드 코딩해야한다는 것을 의미합니다. 그 좋은 :) – Bozho

+1

스프링 mvc 지원 요청 자리 표시 자 주석,이 너무 헤더 속성에서 작동 할 수 있습니다 – msangel

관련 문제