2012-05-13 3 views
2

Я пытаюсь решить, как перенаправить с моего webapp на другой сервер, сохраняя любые пути и GET vars.spring mvc путь перенаправления и все дети в другой домен

например

www.myapp.com/foo 
foo.com 

www.myapp.com/foo/bar 
foo.com/bar 

www.myapp.com/foo?bar=1 
foo.com?bar=1 

Я Idealy просто хотел бы использовать что-то вроде

<mvc:view-controller path="/foo/**" view-name="redirect:http://foo.com**" /> 

ответ

1

Я закончил с использованием фильтра.

инфраструктурно это, кажется, самый простой способ

реализация фильтра:

public class DomainRedirectFilter extends OncePerRequestFilter { 

    private String destinationDomain; 
    private String sourceServletPath; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     String path = request.getServletPath(); 
     path = StringUtils.replace(path, getSourceServletPath(), ""); 
     if (request.getQueryString() != null) { 
      path += '?' + request.getQueryString(); 
     } 

     response.setHeader("Location", getDestinationDomain() + path); 
     response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
     response.setHeader("Connection", "close"); 
    } 

web.xml

<filter> 
    <filter-name>fooDomainRedirectFilter</filter-name> 
    <filter-class>com.abc.mvc.util.DomainRedirectFilter</filter-class> 
    <init-param> 
     <param-name>destinationDomain</param-name> 
     <param-value>http://foo.abc.com</param-value> 
    </init-param> 
    <init-param> 
     <param-name>sourceServletPath</param-name> 
     <param-value>/foo</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>fooDomainRedirectFilter</filter-name> 
    <url-pattern>/foo/*</url-pattern> 
    <url-pattern>/foo</url-pattern> 
</filter-mapping> 

мне нужно добавить 2 URL-шаблоны, чтобы позволить

/foo 
/foo?id=1 
/foo/bar 
/foo/bar?id=1 
0

Что-то вроде этого, вероятно, следует сделать с виртуальными хостами через Apache.

Вот ссылка на некоторые документы:

http://httpd.apache.org/docs/2.0/vhosts/examples.html

+0

В идеале мы не хотим привлекать apache httpd в этом уравнении – kabal

+0

Я не верю, что есть способ сделать это с помощью только Spring MVC, так как все Spring MVC предоставляет веб-фреймворк для сервлетов. Что-то нужно было сделать на уровне контейнера сервлетов (т. Е. Tomcat, или Apache перенаправляет Tomcat через прокси). – dardo

1

Вы также можете сделать это, как Handler, если вы используете что-то наподобие Jetty.

public class DomainRedirectHandler extends HandlerWrapper { 

    @Override 
    public void handle(String target, Request baseRequest, HttpServletRequest request, 
      HttpServletResponse response) throws IOException, ServletException { 

     String hostName = request.getHeader("Host"); 
     if (hostName == null) { 
      getHandler().handle(target, baseRequest, request, response); 
      return; 
     } 

     // see if the host header has a domain name that we are redirecting 
     hostName = hostName.toLowerCase(); 
     int index = hostName.indexOf(':'); 
     if (index >= 0) { 
      // cut off the optional port suffix 
      hostName = hostName.substring(0, index); 
     } 

     if (hostName.equals("some.domain.com")) { 
      response.sendRedirect("https://some.other.domain.com"); 
     } else { 
      getHandler().handle(target, baseRequest, request, response); 
     } 
    } 
} 

Это, очевидно, должно быть до того, как ваши обработчики содержимого в цепочке обработчиков будут эффективными.

Смежные вопросы