Примеры использования для класса Jetty ProxyServlet.Transparent - PullRequest
10 голосов
/ 17 ноября 2011

Я пытаюсь использовать jetty7 для создания прозрачной настройки прокси. Идея состоит в том, чтобы скрыть исходные серверы за пристенным сервером, чтобы входящий запрос мог быть прозрачным образом перенаправлен на исходные серверы.

Я хочу знать, могу ли я использовать для этого реализацию ProxyServlet.Transparent в Jetty. Если да, может ли кто-нибудь привести мне несколько примеров.

1 Ответ

8 голосов
/ 07 декабря 2012

Этот пример основан на Jetty-9.Если вы хотите реализовать это с Jetty 8, реализуйте метод proxyHttpURI (см. Jetty 8 javadocs .).Вот пример кода.

import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.eclipse.jetty.servlets.ProxyServlet;

/**
 * When a request cannot be satisfied on the local machine, it asynchronously
 * proxied to the destination box. Define the rule 
 */
public class ContentBasedProxyServlet extends ProxyServlet {
    private int remotePort = 8080;

    public void setPort(int port) {
        this.remotePort = port;
    }

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        super.service(request, response);
    }

    /**
     *  Applicable to Jetty 9+ only. 
     */
    @Override
    protected URI rewriteURI(HttpServletRequest request) {
        String proxyTo = getProxyTo(request);
        if (proxyTo == null)
            return null;
        String path = request.getRequestURI();
        String query = request.getQueryString();
        if (query != null)
            path += "?" + query;
        return URI.create(proxyTo + "/" + path).normalize();
    }

    private String getProxyTo(HttpServletRequest request) {
    /*
    *   Implement this method: All the magic happens here. Use this method to figure out your destination machine address. You can maintain
    *   a static list of addresses, and depending on the URI or request content you can route your request transparently.
    */
    }
}

Более того, вы можете реализовать фильтр, который определяет, должен ли запрос завершаться на локальном компьютере или на компьютере назначения.Если запрос предназначен для удаленного компьютера, перенаправьте запрос на этот сервлет.

// Declare this method call in the filter.
request.getServletContext()
    .getNamedDispatcher("ContentBasedProxyServlet")
    .forward(request, response);
...