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.