[JAVA] [Aktualisiert Dezember 2018] Tipps für integrierte Webserver und Serverlets, die mit Jetty9 erstellt wurden

Wie Sie wissen, ist Jetty9 ein leichter und hochfunktioneller Webserver-Servlet-Container.

Hier ist ein Beispielcode, der häufig verwendete Einstellungstipps und Servlets enthält, wenn Sie Jetty9 als integrierte Java-Anwendung verwenden.

Ein funktionierender Satz von Quellcode (Maven-Projekt) finden Sie unter https://github.com/riversun/jetty9-quick-start.

Artikel zu HTTPS (SSL / TLS) mit Jetty9 sind unter https://qiita.com/riversun/items/2909019123b28471ea79 zusammengefasst.

In Jetty9 integrierte Einstellungstipps (Betrieb mit Version 9.4.12 bestätigt)

● Servlet hinzufügen

Fügen Sie ein Servlet mit dem Namen ExampleServlet.java hinzu, das den Pfad "/ api" akzeptiert.

//ServletContextHandler behandelt Servlet
ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

//Fügen Sie ein Servlet hinzu
servletHandler.addServlet(new ServletHolder(new ExampleServlet()), "/api");

● Geben Sie die Upload-Größe des Formulars an

Wenn Sie versuchen, große Datenmengen hochzuladen, wird möglicherweise ** java.lang.IllegalStateException: Form zu groß ** angezeigt. Geben Sie in diesem Fall die erforderliche Größe mit ** setMaxFormContentSize ** an.


//Geben Sie die Größe des Formular-Uploads an
servletHandler.setMaxFormContentSize(1024 * 1024 * 1024);

● Geben Sie den Speicherort des statischen Inhalts an (statische Datei).

Geben Sie die Ressourcenbasis mit ** setResourceBase ** an.

//ResourceHandler verarbeitet statische Inhalte (grob gesagt)
final ResourceHandler resourceHandler = new ResourceHandler();

//Geben Sie den Speicherort des statischen Inhalts an
resourceHandler.setResourceBase(System.getProperty("user.dir") + "/htdocs");

● Ich möchte keine Liste statischer Inhaltsdateien anzeigen

Es ist eine traditionelle ~~ neugierige ~~ Funktion von Webservern wie Apache. Wenn Sie die Dateiliste (Auflistung) nicht anzeigen möchten, tun Sie dies

//Liste der statischen Inhaltsdateien nicht anzeigen (Auflistung)
resourceHandler.setDirectoriesListed(false);

● Ich möchte das Standard-HTML von index.html ändern

Kann mit ** setWelcomeFiles ** geändert werden

//Geben Sie die Datei an, die ursprünglich angezeigt werden soll
resourceHandler.setWelcomeFiles(new String[] { "index.html" });

● Deaktivieren Sie den Cache. Nicht zwischenspeichern.

Eine Möglichkeit, das Caching von statischen Inhalten zu deaktivieren, die HTML- und JavaScript-Entwickler plagen. ** setCacheControl ** befreit Sie von F5 wiederholten Wasserschlägen auf verbrannten Steinen.

//Nicht zwischenspeichern
resourceHandler.setCacheControl("no-store,no-cache,must-revalidate");

● Senden Sie keine Serverversionsinformationen in Headern usw.

Es wird verwendet, wenn Sie keine Informationen wie die Versionsnummer des Stegs im HTTP-Header oder den Standardfehlerbildschirm anzeigen möchten. Es kann mit ** HttpConfig # setSendServerVersion ** eingestellt werden.

Ich werde Ihnen zwei Methoden zeigen (Was ich tun möchte, ist einfach, aber der Code ist etwas länger. Dies ist komplizierter als jetty8 mit jetty9 refactoring)

[Methode 1] Erstellen Sie Ihren eigenen http-Connector und legen Sie httpConfig fest

//Initialisieren Sie den Server mit dem Standardkonstruktor
final Server jettyServer = new Server();
jettyServer.setHandler(handlerList);

final int PORT = 8080;

//http-Konfigurationsklasse
final HttpConfiguration httpConfig = new HttpConfiguration();

//Fügen Sie keine Serverversionsinformationen in den Header ein
httpConfig.setSendServerVersion(false);
final HttpConnectionFactory httpConnFactory = new HttpConnectionFactory(httpConfig);
final ServerConnector httpConnector = new ServerConnector(jettyServer, httpConnFactory);
httpConnector.setPort(PORT);
jettyServer.setConnectors(new Connector[] { httpConnector });

[Methode 2] Ziehen Sie den (vorhandenen) http-Connector heraus und setzen Sie httpConfig

final int PORT = 8080;

final Server jettyServer = new Server(PORT );

for (Connector conn : jettyServer.getConnectors()) {
  for (ConnectionFactory connFactory : conn.getConnectionFactories()) {
    if (connFactory instanceof HttpConnectionFactory) {
      ((HttpConnectionFactory) connFactory).getHttpConfiguration().setSendServerVersion(false);
    }
  }
}

Servlet auf Jetty9 vollständiger Beispielcode

Ein CORS (domänenübergreifendes) Web-API-ähnliches Servlet-Beispiel, das einen JSON zurückgibt, das den oben beschriebenen Code enthält. Legen Sie die Abhängigkeit von Maven fest, kopieren und ausführen Sie sie und greifen Sie auf http: // localhost: 8080 / api? Message = hello zu.

package com.example.jetty;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * Jetty9 Quick Start Example
 */
public class ServletApp
{
	public static void main(String[] args) {

		//ServletContextHandler behandelt Servlet
		ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

		//Geben Sie die Größe des Formular-Uploads an
		servletHandler.setMaxFormContentSize(1024 * 1024 * 1024);

		//Fügen Sie ein Servlet hinzu
		servletHandler.addServlet(new ServletHolder(new ExampleServlet()), "/api");

		//ResourceHandler verarbeitet statische Inhalte (grob gesagt)
		final ResourceHandler resourceHandler = new ResourceHandler();

		//Geben Sie den Speicherort des statischen Inhalts an
		resourceHandler.setResourceBase(System.getProperty("user.dir") + "/htdocs");

		//Liste der statischen Inhaltsdateien nicht anzeigen (Auflistung)
		resourceHandler.setDirectoriesListed(false);

		//Geben Sie die Datei an, die ursprünglich angezeigt werden soll
		resourceHandler.setWelcomeFiles(new String[] { "index.html" });

		//Nicht zwischenspeichern
		resourceHandler.setCacheControl("no-store,no-cache,must-revalidate");

		HandlerList handlerList = new HandlerList();

		//Geben Sie resourceHandler als erstes an (umgekehrt wird statischer Inhalt nicht für immer aufgerufen.)
		handlerList.addHandler(resourceHandler);
		handlerList.addHandler(servletHandler);

		//Initialisieren Sie den Server mit dem Standardkonstruktor
		final Server jettyServer = new Server();
		jettyServer.setHandler(handlerList);

		final int PORT = 8080;

		//http-Konfigurationsklasse
		final HttpConfiguration httpConfig = new HttpConfiguration();

		//Fügen Sie keine Serverversionsinformationen in den Header ein
		httpConfig.setSendServerVersion(false);
		final HttpConnectionFactory httpConnFactory = new HttpConnectionFactory(httpConfig);
		final ServerConnector httpConnector = new ServerConnector(jettyServer, httpConnFactory);
		httpConnector.setPort(PORT);
		jettyServer.setConnectors(new Connector[] { httpConnector });

		try {
			jettyServer.start();
			jettyServer.join();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("serial")
	public static class ExampleServlet extends HttpServlet {

		final ObjectMapper mObjectMapper = new ObjectMapper();

		final class Result {
			public boolean success;
			public String message;
		}

		@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

			//Abfrageparameter abrufen
			final String paramMessage = req.getParameter("message");

			//POJO für die Antwortspeicherung(Später in JSON konvertieren)
			final Result result = new Result();
			result.success = true;
			result.message = "You say '" + paramMessage + "'";

			// CORS(Cross-Origin Resource Sharing)Aktivieren
			resp.addHeader("Access-Control-Allow-Origin", "*");
			resp.addHeader("Access-Control-Allow-Headers", "Content-Type");

			//Inhalt, der JSON zurückgibt-Setzen Sie Type auf JSON
			final String CONTENT_TYPE = "application/json; charset=UTF-8";
			resp.setContentType(CONTENT_TYPE);

			final PrintWriter out = resp.getWriter();
			//Konvertieren Sie POJO in JSON in Jackson
			final String json = mObjectMapper.writeValueAsString(result);

			//Generieren Sie eine Antwort
			out.println(json);
			out.close();

		}

		@Override
		protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, POST is not supported");
		}

		@Override
		protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, PUT is not supported");
		}

		@Override
		protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Sorry, DELETE is not supported");
		}

		@Override
		protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

			// For PreFlight Access
			// CORS(Cross-Origin Resource Sharing)Aktivieren
			resp.addHeader("Access-Control-Allow-Origin", "*");
			resp.addHeader("Access-Control-Allow-Headers", "Content-Type");

		}

	}

		
}

Maven

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.12.v20180830</version>
</dependency>

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.4.12.v20180830</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8.1</version>
</dependency>

Quellcode

Der Quellcode ist hier https://github.com/riversun/jetty9-quick-start

abschließend

Verwenden Sie für die detaillierte Bedienung von ** Jetty ** das Motiv "HTTPS-Server mit 20 Zeilen erstellen!" [dieser Artikel](https: / /qiita.com/riversun/items/2909019123b28471ea79).

Recommended Posts

[Aktualisiert Dezember 2018] Tipps für integrierte Webserver und Serverlets, die mit Jetty9 erstellt wurden
Hallo Welt mit Java Servlet und JSP (Einfacher Start des Webservers mit Maven + Jetty)
Welcher der drei in Java eingebetteten Webserver Tomcat, Jetty und Undertow arbeitete an GraalVM?
Rails-Webserver und Anwendungsserver
Vergleich der WEB-Anwendungsentwicklung mit Rails und Java Servlet + JSP
[Tipps] So lösen Sie Probleme mit XCode und Swift für Anfänger