2011-05-18 55 views
6

我正在使用澤西和Grizzly的嵌入版本,我想只在本地主機上綁定/監聽。我創建使用GrizzlyWebContainerFactory與創建調用ThreadSelector:Grizzly + Jersey僅在本地主機上收聽

threadSelector = GrizzlyWebContainerFactory.create("http://127.0.0.1:8080/", initParams); 

這工作,但我仍然能夠從外部機器點擊服務器。我怎樣才能讓它綁定到/只監聽localhost?

這是用於配置的東西,所以我不想要任何東西離開盒子能夠連接到這臺服務器。

回答

-2

您可以輕鬆擴展GrizzlyWebContainerFactory以支持此需求(因爲該類是最終的,我創建了一個獨立的實用程序,允許您將偵聽套接字綁定到localhost)。您可以使用此實用程序:

SelectorThread threadSelector = GrizzlyWebContainerFactoryUtil.create("http://127.0.0.1:8080/", initParams, true); 

將最後一個參數設置爲true將強制它綁定到localhost。我加入到支持這一要求的唯一的代碼是:

selectorThread.setAddress(InetAddress.getByName("localhost")); 

整個工具類如下所示:

import com.sun.grizzly.http.SelectorThread; 
import com.sun.grizzly.http.servlet.ServletAdapter; 
import com.sun.grizzly.standalone.StaticStreamAlgorithm; 
import com.sun.grizzly.tcp.Adapter; 
import com.sun.grizzly.tcp.http11.GrizzlyAdapter; 
import com.sun.jersey.api.container.ContainerException; 
import com.sun.jersey.api.core.ClasspathResourceConfig; 
import com.sun.jersey.spi.container.servlet.ServletContainer; 

import javax.servlet.Servlet; 
import java.io.File; 
import java.io.IOException; 
import java.net.InetAddress; 
import java.net.URI; 
import java.util.Map; 

public class GrizzlyWebContainerFactoryUtil { 

    public static SelectorThread create(String u, Map<String, String> initParams, boolean localHostOnly) 
      throws IOException, IllegalArgumentException { 
     if (u == null) 
      throw new IllegalArgumentException("The URI must not be null"); 

     return create(URI.create(u), initParams, localHostOnly); 
    } 

    public static SelectorThread create(URI u, Map<String, String> initParams, boolean localHostOnly) throws IOException { 
    return create(u, ServletContainer.class, initParams, localHostOnly); 
    } 

    public static SelectorThread create(URI u, Class<? extends Servlet> c, 
             Map<String, String> initParams, boolean localHostOnly) throws IOException { 
    if (u == null) 
     throw new IllegalArgumentException("The URI must not be null"); 

    ServletAdapter adapter = new ServletAdapter(); 
    if (initParams == null) { 
     adapter.addInitParameter(ClasspathResourceConfig.PROPERTY_CLASSPATH, 
     System.getProperty("java.class.path").replace(File.pathSeparatorChar, ';')); 
    } else { 
     for (Map.Entry<String, String> e : initParams.entrySet()) { 
     adapter.addInitParameter(e.getKey(), e.getValue()); 
     } 
    } 

    adapter.setServletInstance(getInstance(c)); 

    String path = u.getPath(); 
    if (path == null) 
     throw new IllegalArgumentException("The URI path, of the URI " + u + 
     ", must be non-null"); 
    else if (path.length() == 0) 
     throw new IllegalArgumentException("The URI path, of the URI " + u + 
     ", must be present"); 
    else if (path.charAt(0) != '/') 
     throw new IllegalArgumentException("The URI path, of the URI " + u + 
     ". must start with a '/'"); 

    if (path.length() > 1) { 
     if (path.endsWith("/")) 
     path = path.substring(0, path.length() - 1); 
     adapter.setContextPath(path); 
    } 

    return create(u, adapter, localHostOnly); 
    } 

    private static Servlet getInstance(Class<? extends Servlet> c) { 
    try { 
     return c.newInstance(); 
    } catch (Exception e) { 
     throw new ContainerException(e); 
    } 
    } 


    public static SelectorThread create(URI u, Adapter adapter, boolean localHostOnly) 
    throws IOException, IllegalArgumentException { 
    if (u == null) 
     throw new IllegalArgumentException("The URI must not be null"); 

    // TODO support https 
    final String scheme = u.getScheme(); 
    if (!scheme.equalsIgnoreCase("http")) 
     throw new IllegalArgumentException("The URI scheme, of the URI " + u + 
     ", must be equal (ignoring case) to 'http'"); 

    if (adapter instanceof GrizzlyAdapter) { 
     GrizzlyAdapter ga = (GrizzlyAdapter) adapter; 
     ga.setResourcesContextPath(u.getRawPath()); 
    } 

    final SelectorThread selectorThread = new SelectorThread(); 

    selectorThread.setAlgorithmClassName(StaticStreamAlgorithm.class.getName()); 

    final int port = (u.getPort() == -1) ? 80 : u.getPort(); 
    selectorThread.setPort(port); 

    if (localHostOnly) { 
     selectorThread.setAddress(InetAddress.getByName("localhost")); 
    } 
    selectorThread.setAdapter(adapter); 

    try { 
     selectorThread.listen(); 
    } catch (InstantiationException e) { 
     IOException _e = new IOException(); 
     _e.initCause(e); 
     throw _e; 
    } 
    return selectorThread; 
    } 

} 
11

我能有做到這一點使用主機名localhost澤西2.3.1灰熊的嵌入式版本:

import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; 
// ... 
GrizzlyHttpServerFactory.createHttpServer(
    URI.create("http://localhost:9580/my-app/") 
); 

測試結果是:

> curl -I http://myhost.com:9580/my-app 
curl: (7) couldn't connect to host 

而用的URI "http://0.0.0.0:9580/my-app/",或"http://myhost.com:9580/my-app/"啓動灰熊服務器時,我能夠與

> curl -I http://myhost.com:9580/my-app 
HTTP/1.1 200 Not Found 
... 

打它這裏有一個表,它的主機有哪些URL使用GrizzlyHttpServerFactory時工作。這裏沒有驚喜,據我所知:

# For http://0.0.0.0:9575/my-app  | Works? 
curl -I http://0.0.0.0:9575/my-app | Yes 
curl -I http://127.0.0.1:9575/my-app | Yes 
curl -I http://localhost:9575/my-app | Yes 
curl -I http://myhost.com:9575/my-app | Yes 
             | 
# For http://127.0.0.1:9575/my-app | 
# For http://localhost:9575/my-app | 
curl -I http://0.0.0.0:9575/my-app | Yes 
curl -I http://127.0.0.1:9575/my-app | Yes 
curl -I http://localhost:9575/my-app | Yes 
curl -I http://myhost.com:9575/my-app | No 
             | 
# For http://myhost.com:9585/my-app | 
curl -I http://0.0.0.0:9585/my-app | No 
curl -I http://127.0.0.1:9585/my-app | No 
curl -I http://localhost:9575/my-app | No 
curl -I http://myhost.com:9585/my-app | Yes