Introduktion til JBoss Undertow

1. Oversigt

Undertow er en ekstremt let og højtydende webserver fra JBoss. Det understøtter både blokerende og ikke-blokerende API'er med NIO.

Da det er skrevet er Java, kan det bruges i alle JVM-baserede applikationer i indlejret tilstand, endda JBoss WilfFly server bruger internt Undertow for at forbedre serverens ydeevne.

I denne vejledning viser vi funktionerne i Undertow, og hvordan man bruger det.

2. Hvorfor Undertow?

  • Letvægt: Undertow er ekstremt let på under 1 MB. I integreret tilstand bruger den kun 4 MB bunkeplads ved kørsel
  • Servlet 3.1: Det understøtter fuldt ud Servlet 3.1
  • Web Socket: Det understøtter Web Socket funktionalitet (inklusive JSR-356)
  • Vedvarende forbindelse: Som standard Undertow inkluderer vedvarende HTTP-forbindelser ved at tilføje holde i live svarhoved. Det hjælper klienter, der understøtter vedvarende forbindelser, med at optimere ydeevnen ved at genbruge forbindelsesoplysninger

3. Brug af Undertow

Lad os begynde at bruge Undertow ved at oprette en simpel webserver.

3.1. Maven afhængighed

At bruge Undertow, skal vi tilføje følgende afhængighed til vores pom.xml:

 io.undertow undertow-servlet 1.4.18.Final 

For at bygge en krukke, der kan køres, skal vi også tilføje maven-shade-plugin. Derfor skal vi også tilføje nedenstående konfiguration:

 org.apache.maven.plugins maven-skygge-plugin pakke skygge 

Den seneste version af Undertow er tilgængelig i Central Maven Repository.

3.2. Enkel server

Med nedenstående kodestykke kan vi oprette en simpel webserver ved hjælp af Undertow's Bygger API:

public class SimpleServer {public static void main (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost"). setHandler (exchange -> {exchange.getResponseHeaders () .put (Headers.CONTENT_TYPE) , "text / plain"); exchange.getResponseSender (). send ("Hello Baeldung");}). build (); server.start (); }}

Her har vi brugt Bygger API til at binde 8080 port til denne server. Bemærk også, at vi har brugt et lambda-udtryk til at bruge handler.

Vi kan også bruge nedenstående kodestykke til at gøre det samme uden at bruge lambda-udtryk:

Undertow-server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (ny HttpHandler () {@ Override offentlig ugyldig handleRequest (HttpServerExchange-udveksling) kaster undtagelse {exchange.getResponseHeaders (). Put (Headers.CONTENT_TYPE) tekst / almindelig "); exchange.getResponseSender (). send (" Hej Baeldung ");}}). build ();

Den vigtige ting at bemærke her er brugen af HttpHandler API. Det er det vigtigste plugin til at tilpasse et Undertow applikation baseret på vores behov.

I dette tilfælde har vi tilføjet en tilpasset handler, der tilføjer Indholdstype: tekst / almindeligt svartekst med hver anmodning.

På samme måde, hvis vi vil returnere nogle standardtekster med hvert svar, kan vi bruge nedenstående kodestykke:

exchange.getResponseSender () .send ("Hej Baeldung");

3.3. Sikker adgang

I de fleste tilfælde tillader vi ikke alle brugere at få adgang til vores server. Normalt kan brugere med gyldig legitimationsoplysninger få adgang. Vi kan implementere den samme mekanisme med Undertow.

For at implementere det skal vi oprette en identitetsadministrator, der kontrollerer brugerens ægthed for hver anmodning.

Vi kan bruge Undertow's IdentityManager for det:

offentlig klasse CustomIdentityManager implementerer IdentityManager {private Map-brugere; // standardkonstruktører @ Override offentlig konto-bekræftelse (Kontokonto) {returkonto; } @ Override offentlig konto-bekræftelse (legitimationsoplysninger) {return null; } @ Override offentlig konto-bekræftelse (streng-id, legitimationsoplysninger) {konto-konto = getAccount (id); hvis (konto! = null && verificere legitimationsoplysninger (konto, legitimationsoplysninger)) {returkonto; } returnere null; }}

Når identitetsadministratoren er oprettet, er vi nødt til at oprette et rige, der holder brugerens legitimationsoplysninger:

privat statisk HttpHandler addSecurity (HttpHandler toWrap, IdentityManager identityManager) {HttpHandler handler = toWrap; handler = ny AuthenticationCallHandler (handler); handler = ny AuthenticationConstraintHandler (handler); Listemekanismer = Collections.singletonList (ny BasicAuthenticationMechanism ("Baeldung_Realm")); handler = ny AuthenticationMechanismsHandler (handler, mekanismer); handler = ny SecurityInitialHandler (AuthenticationMode.PRO_ACTIVE, identityManager, handler); returhandler }

Her har vi brugt AuthenticationMode som PRO_ACTIVE hvilket betyder, at enhver anmodning, der kommer til denne server, sendes til de definerede godkendelsesmekanismer for at udføre godkendelse ivrigt.

Hvis vi definerer AuthenticationMode som CONSTRAINT_DRIVEN, så vil kun disse anmodninger gennemgå de definerede godkendelsesmekanismer, hvor begrænsningen / de begrænsninger, der kræver godkendelse, udløses.

Nu skal vi bare kortlægge dette område og identitetsadministratoren med serveren, før den starter:

public static void main (String [] args) {Map users = new HashMap (2); users.put ("root", "password" .toCharArray ()); users.put ("admin", "password" .toCharArray ()); IdentityManager idm = nye CustomIdentityManager (brugere); Undertow-server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (addSecurity (e -> setExchange (e), idm)). Build (); server.start (); } privat statisk ugyldigt sætExchange (HttpServerExchange exchange) {SecurityContext context = exchange.getSecurityContext (); exchange.getResponseSender (). send ("Hej" + context.getAuthenticatedAccount (). getPrincipal (). getName (), IoCallback.END_EXCHANGE); }

Her har vi oprettet to brugerforekomster med legitimationsoplysninger. Når serveren er oppe, skal vi bruge en af ​​disse to legitimationsoplysninger for at få adgang til den.

3.4. Web-stik

Det er ligetil at oprette web-socket udvekslingskanal med UnderTow's WebSocketHttpExchange API.

For eksempel kan vi åbne en stikkontaktkommunikationskanal på stien baeldungApp med nedenstående kodestykke:

public static void main (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (sti (). addPrefixPath ("/ baeldungApp", websocket ((udveksling, kanal) - > {channel.getReceiveSetter (). sæt (getListener ()); channel.resumeReceives ();})). addPrefixPath ("/", ressource (ny ClassPathResourceManager (SocketServer.class.getClassLoader (), SocketServer.class.getPackage ( addWelcomeFiles ("index.html"))) .build (); server.start (); } privat statisk AbstractReceiveListener getListener () {returner ny AbstractReceiveListener () {@Override beskyttet ugyldighed onFullTextMessage (WebSocketChannel-kanal, BufferedTextMessage-meddelelse) {String messageData = message.getData (); til (WebSocketChannel-session: channel.getPeerConnections ()) {WebSockets.sendText (messageData, session, null); }}} }

Vi kan oprette en HTML-side med navnet index.html og brug JavaScript WebSocket API til at oprette forbindelse til denne kanal.

3.5. Filserver

Med Undertow, kan vi også oprette en filserver, der kan vise katalogindhold og direkte servere filer fra biblioteket:

offentlig statisk ugyldig hoved (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (ressource (ny PathResourceManager (Paths.get (System.getProperty ("user.home")) ), 100)) .setDirectoryListingEnabled (true)) .build (); server.start (); }

Vi behøver ikke oprette noget brugergrænsefladeindhold for at få vist bibliotekets indhold. Ud af boksen Undertow giver en side til denne skærmfunktionalitet.

4. Spring Boot Plugin

Undtagen Tomcat og Anløbsbro,Spring Boot bakker op UnderTow som den integrerede servletbeholder. At bruge Undertow, skal vi tilføje følgende afhængighed i pom.xml:

 org.springframework.boot spring-boot-starter-undertow 1.5.6.RELEASE 

Den seneste version af Spring Boot Undertow-plugin er tilgængelig i Central Maven Repository.

5. Konklusion

I denne artikel lærte vi om Undertow og hvordan vi kan oprette forskellige typer servere med det.

Som altid er den fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found