2011-11-17 16 views
9

Sto tentando di utilizzare jetty7 per creare un'impostazione proxy trasparente. L'idea è di nascondere i server di origine dietro il server jetty in modo che la richiesta in arrivo possa essere inoltrata in modo trasparente ai server di origine.Esempi di utilizzo per ProxyServlet di Jetty. Classe trasparente

Voglio sapere se posso usare l'implementazione ProxyServlet.Transparent di jetty per farlo. Se sì, qualcuno può darmi qualche esempio.

risposta

6

Questo esempio è basato su Jetty-9. Se vuoi implementarlo con Jetty 8, implementa il metodo proxyHttpURI (vedi Jetty 8 javadocs.). Ecco alcuni esempi di codice.

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. 
*/ 
} 
} 

ulteriormente più, è possibile implementare un filtro che determina se la richiesta deve terminare sulla macchina locale o sulla macchina di destinazione. Se la richiesta è destinata al computer remoto, inoltrare la richiesta a questo servlet.

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

Ho provato questa soluzione con il molo 9 e non funziona. Mi sta dando una NullPointerException per qualche ragione sul metodo service(). – FearUs

+0

Avrò bisogno di più informazioni come tracce di stack o codice reale per fare raccomandazioni. La maggior parte di ciò che piace a NPE sta risalendo dal metodo getProxyTo() o dal metodo rewriteURI(). – systemboot

+0

@ user766453 l'esempio è fantastico. Tuttavia, sto affrontando - javax.servlet.ServletException: java.lang.IllegalStateException: nessun esecutore del server per il proxy. Hai qualche idea? Ho posto la mia domanda qui - http://stackoverflow.com/questions/27624873/proxyservlet-stop-working-after-migration-from-jetty-8-to-jetty-9 –