Java spring mvc将路径和所有子项重定向到另一个域
我正在尝试解决如何从我的webapp重定向到另一台服务器,保留任何路径并获取vars 乙二醇 我很想用这样的东西Java spring mvc将路径和所有子项重定向到另一个域,java,spring-mvc,http-redirect,Java,Spring Mvc,Http Redirect,我正在尝试解决如何从我的webapp重定向到另一台服务器,保留任何路径并获取vars 乙二醇 我很想用这样的东西 <mvc:view-controller path="/foo/**" view-name="redirect:http://foo.com**" /> 类似的事情可能应该通过Apache在虚拟主机上完成 以下是一些文档的链接: public class DomainRedirectFilter extends OncePerRequestFilter { p
<mvc:view-controller path="/foo/**" view-name="redirect:http://foo.com**" />
类似的事情可能应该通过Apache在虚拟主机上完成 以下是一些文档的链接:
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" );
}
我最后使用了一个过滤器 在基础设施方面,这似乎是最简单的方法 筛选器实现:
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>
如果您使用的是类似于
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);
}
}
}
这显然需要在处理程序链中的内容处理程序生效之前进行。理想情况下,我们不希望在这个等式中包含apache httpd。我不认为只有Spring MVC可以做到这一点,因为Spring MVC所做的只是为servlet提供一个web框架。必须在servlet容器级别执行某些操作(例如Tomcat,或者通过代理将Apache重定向到Tomcat)。
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);
}
}
}