Introduksjon til JBoss Undertow

1. Oversikt

Undertow er en ekstremt lett og høyytelses webserver fra JBoss. Den støtter både blokkerende og ikke-blokkerende APIer med NIO.

Siden det er skrevet er Java, kan det brukes i alle JVM-baserte applikasjoner i innebygd modus, til og med JBoss WilfFly server bruker internt Undertow for å forbedre serverens ytelse.

I denne veiledningen viser vi funksjonene til Undertow og hvordan du bruker den.

2. Hvorfor Undertow?

  • Lettvekt: Undertow er ekstremt lett på under 1 MB. I innebygd modus bruker den bare 4 MB bunkeplass ved kjøretid
  • Servlet 3.1: Den støtter fullt ut Servlet 3.1
  • Web Socket: Den støtter Web Socket-funksjonalitet (inkludert JSR-356)
  • Vedvarende tilkobling: Som standard Undertow inkluderer vedvarende HTTP-tilkoblinger ved å legge til holde i live svarhode. Det hjelper klienter som støtter vedvarende tilkoblinger for å optimalisere ytelsen ved å gjenbruke tilkoblingsdetaljer

3. Bruke Undertow

La oss begynne å bruke Undertow ved å opprette en enkel webserver.

3.1. Maven avhengighet

Å bruke Undertow, må vi legge til følgende avhengighet til vår pom.xml:

 io.undertow undertow-servlet 1.4.18.Final 

For å bygge en kjørbar krukke, må vi også legge til maven-shade-plugin. Derfor må vi også legge til under konfigurasjonen også:

 org.apache.maven.plugins maven-shade-plugin pakke skyggen 

Den siste versjonen av Undertow er tilgjengelig i Central Maven Repository.

3.2. Enkel server

Med kodebiten nedenfor kan vi lage en enkel webserver ved hjelp av 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 brukt Bygger API for å binde 8080 port til denne serveren. Vær også oppmerksom på at vi har brukt et lambdauttrykk for å bruke føreren.

Vi kan også bruke kodebiten nedenfor for å gjøre det samme uten å bruke lambdauttrykk:

Undertow server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (ny HttpHandler () {@ Override public void handleRequest (HttpServerExchange exchange) kaster unntak {exchange.getResponseHeaders (). Put (Headers.CONTENT_TYPE) tekst / vanlig "); exchange.getResponseSender (). send (" Hei Baeldung ");}}). build ();

Det viktige å merke seg her er bruken av HttpHandler API. Det er det viktigste pluginet for å tilpasse et Undertow applikasjon basert på våre behov.

I dette tilfellet har vi lagt til en tilpasset behandler som vil legge til Innholdstype: tekst / vanlig svarhode med hver forespørsel.

På samme måte, hvis vi vil returnere noen standardtekst med hvert svar, kan vi bruke kodebiten nedenfor:

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

3.3. Sikker tilgang

I de fleste tilfeller tillater vi ikke alle brukere tilgang til serveren vår. Vanligvis kan brukere med gyldig legitimasjon få tilgang. Vi kan implementere den samme mekanismen med Undertow.

For å implementere det, må vi opprette en identitetsbehandling som vil kontrollere brukerens ekthet for hver forespørsel.

Vi kan bruke Undertow's IdentityManager for dette:

offentlig klasse CustomIdentityManager implementerer IdentityManager {private Map-brukere; // standardkonstruktører @ Override offentlig kontoverifisering (kontokonto) {retur konto; } @ Override offentlig kontobekreftelse (legitimasjon) {return null; } @ Override offentlig kontobekreftelse (streng-ID, legitimasjon) {kontokonto = getAccount (id); hvis (konto! = null && verifiser legitimasjon (konto, legitimasjon)) {retur konto; } returner null; }}

Når identitetsbehandling er opprettet, må vi opprette et rike som vil inneholde brukerlegitimasjonen:

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

Her har vi brukt AuthenticationMode som PRO_ACTIVE som betyr at hver forespørsel som kommer til denne serveren vil bli sendt til de definerte autentiseringsmekanismene for å utføre autentisering ivrig.

Hvis vi definerer AuthenticationMode som CONSTRAINT_DRIVEN, så vil bare disse forespørslene gå gjennom de definerte autentiseringsmekanismene der begrensningene som krever autorisering utløses.

Nå trenger vi bare å kartlegge dette riket og identitetsbehandling 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 (brukere); Undertow-server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (addSecurity (e -> setExchange (e), idm)). Build (); server.start (); } privat statisk ugyldig setExchange (HttpServerExchange exchange) {SecurityContext context = exchange.getSecurityContext (); exchange.getResponseSender (). send ("Hei" + context.getAuthenticatedAccount (). getPrincipal (). getName (), IoCallback.END_EXCHANGE); }

Her har vi opprettet to brukerforekomster med legitimasjon. Når serveren er oppe, må vi bruke noen av disse to legitimasjonene for å få tilgang til den.

3.4. Webkontakt

Det er greit å lage web-utvekslingskanal med UnderTow's WebSocketHttpExchange API.

For eksempel kan vi åpne en kontaktkommunikasjonskanal på banen baeldungApp med under kodebit:

public static void main (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (path (). addPrefixPath ("/ baeldungApp", websocket ((exchange, channel) - > {channel.getReceiveSetter (). sett (getListener ()); channel.resumeReceives ();})). addPrefixPath ("/", ressurs (ny ClassPathResourceManager (SocketServer.class.getClassLoader (), SocketServer.class.getPackage ( addWelcomeFiles ("index.html"))) .build (); server.start (); } privat statisk AbstractReceiveListener getListener () {returner ny AbstractReceiveListener () {@Override beskyttet ugyldighet onFullTextMessage (WebSocketChannel kanal, BufferedTextMessage melding) {String messageData = message.getData (); for (WebSocketChannel-økt: channel.getPeerConnections ()) {WebSockets.sendText (messageData, session, null); }}}; }

Vi kan opprette en HTML-side med navnet index.html og bruk JavaScript WebSocket API for å koble til denne kanalen.

3.5. Filserver

Med Undertow, kan vi også opprette en filserver som kan vise kataloginnhold og direkte servere filer fra katalogen:

public static void main (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (resource (new PathResourceManager (Paths.get (System.getProperty ("user.home")) ), 100)) .setDirectoryListingEnabled (true)) .build (); server.start (); }

Vi trenger ikke lage noe brukergrensesnittinnhold for å vise kataloginnholdet. Ut av boksen Undertow gir en side for denne skjermfunksjonaliteten.

4. Spring Boot Plugin

Bortsett fra Tomcat og Brygge,Vårstøvel støtter UnderTow som den innebygde servletbeholderen. Å bruke Undertow, må vi legge til følgende avhengighet i pom.xml:

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

Den siste versjonen av Spring Boot Undertow-plugin er tilgjengelig i Central Maven Repository.

5. Konklusjon

I denne artikkelen lærte vi om Undertow og hvordan vi kan lage forskjellige typer servere med den.

Som alltid er hele kildekoden tilgjengelig på GitHub.


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