spring mvc перенаправляет путь и всех детей в другой домен
Я пытаюсь решить, как перенаправить с моего веб-приложения на другой сервер, сохраняя любые пути и получая vars.
Например
www.myapp.com/foo
foo.com
www.myapp.com/foo/bar
foo.com/bar
www.myapp.com/foo?bar=1
foo.com?bar=1
Я бы в идеале просто хотел использовать что-то вроде
<mvc:view-controller path="/foo/**" view-name="redirect:http://foo.com**" />
3 ответа:
В итоге я использовал фильтр.
В инфраструктурном плане это, кажется, самый простой способ
Реализация фильтра:
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" ); }
Паутина.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
Вы также можете сделать это как
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); } } }
Очевидно, что это должно быть до того, как ваши обработчики контента в цепочке обработчиков будут эффективными.