2

パスと GET 変数を保持しながら、webapp から別のサーバーにリダイレクトする方法を考え出そうとしています。

例えば

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**" />
4

3 に答える 3

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
于 2012-05-15T00:29:40.303 に答える
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);
        }
    }
}

これは明らかに、ハンドラー チェーン内のコンテンツ ハンドラーが有効になる前に行う必要があります。

于 2015-10-17T22:15:24.967 に答える
0

このようなことは、おそらく Apache を介して仮想ホストで行う必要があります。

いくつかのドキュメントへのリンクは次のとおりです。

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

于 2012-05-13T04:25:29.083 に答える