Grizzly + Jersey Прослушивание ТОЛЬКО на Localhost

Я использую Джерси со встроенной версией Grizzly, и я хотел бы выполнять привязку/прослушивание ТОЛЬКО на локальном хосте. Я создаю ThreadSelector с помощью GrizzlyWebContainerFactory с вызовом create:

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

Это работает, но я все еще могу подключиться к серверу с внешней машины. Как я могу заставить его привязываться/слушать ТОЛЬКО на локальном хосте?

Это для настройки, поэтому я не хочу, чтобы что-то из коробки могло подключаться к этому серверу.


person Bill    schedule 18.05.2011    source источник


Ответы (2)


Я смог сделать это, используя имя хоста localhost в Джерси 2.3.1 со встроенной версией Grizzly:

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

В то время как при запуске сервера Grizzly с 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
person yegeniy    schedule 15.11.2013

Вы можете легко расширить GrizzlyWebContainerFactory для поддержки этого требования (поскольку класс является окончательным, я создал автономную утилиту, позволяющую привязать слушающий сокет к локальному хосту). Вы можете использовать эту утилиту как:

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

Установка для последнего параметра значения true заставляет его привязываться к локальному хосту. Единственный код, который я добавил для поддержки этого требования:

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;
  }

}
person Arul Dhesiaseelan    schedule 15.06.2011