Uvod u JBoss Undertow

1. Pregled

Undertow je izuzetno lagan i vrlo učinkovit web poslužitelj tvrtke JBoss. Podržava i blokirajuće i neblokirajuće API-je s NIO.

Budući da je napisana kao Java, može se koristiti u bilo kojem JVM programu u ugrađenom načinu, čak i u JBossovom WilfFly poslužitelj interno koristi Undertow za poboljšanje performansi poslužitelja.

U ovom uputstvu pokazat ćemo značajke Undertowa i kako ga koristiti.

2. Zašto Undertow?

  • Lagana: Undertow izuzetno je lagan s manje od 1 MB. U ugrađenom načinu rada koristi samo 4 MB prostora hrpe tijekom izvođenja
  • Servlet 3.1: Potpuno podržava Servlet 3.1
  • Web Socket: Podržava funkcionalnost Web Socket (uključujući JSR-356)
  • Trajna veza: Prema zadanim postavkama, Undertow uključuje trajne HTTP veze dodavanjem držati na životu zaglavlje odgovora. Pomaže klijentima koji podržavaju trajne veze da optimiziraju izvedbu ponovnom upotrebom detalja o povezivanju

3. Korištenje Undertowa

Počnimo koristiti Undertow stvaranjem jednostavnog web poslužitelja.

3.1. Ovisnost Mavena

Koristiti Undertow, trebamo dodati sljedeću ovisnost o našoj pom.xml:

 io.undertow undertow-servlet 1.4.18.Final 

Da bismo napravili jar za pokretanje, također moramo dodati dodatak maven-shadow-dodatak. Zbog toga također moramo dodati i ispod konfiguracije:

 org.apache.maven.plugins maven-shadow-plugin paket sjene 

Najnovija verzija Undertow dostupan je u središnjem spremištu Maven.

3.2. Jednostavan poslužitelj

Pomoću donjeg isječka koda možemo stvoriti jednostavni web poslužitelj pomoću Undertowa Graditelj API:

javna klasa 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 (); }}

Evo, koristili smo Graditelj API za vezanje 8080 priključite na ovaj poslužitelj. Također, imajte na umu da smo koristili lambda izraz za upotrebu rukovatelja.

Također možemo koristiti donji isječak koda da učinimo istu stvar bez upotrebe lambda izraza:

Undertow server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (new HttpHandler () {@Override public void handleRequest (HttpServerExchange exchange) baca iznimku {exchange.getResponseHeaders (). Put (Headers.CONT text / plain "); exchange.getResponseSender (). send (" Hello Baeldung ");}}). build ();

Ovdje je važno napomenuti upotrebu HttpHandler API. To je najvažniji dodatak za prilagodbu Undertow aplikacija temeljena na našim potrebama.

U ovom smo slučaju dodali prilagođeni rukovatelj koji će dodati Vrsta sadržaja: tekst / običan odgovor zaglavlja uz svaki zahtjev.

Slično, ako uz svaki odgovor želimo vratiti neki zadani tekst, možemo koristiti donji isječak koda:

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

3.3. Siguran pristup

U većini slučajeva ne dopuštamo svim korisnicima pristup našem poslužitelju. Obično korisnici s valjanim vjerodajnicama mogu dobiti pristup. Isti mehanizam možemo implementirati s Undertow.

Da bismo je implementirali, moramo stvoriti upravitelj identiteta koji će provjeravati autentičnost korisnika za svaki zahtjev.

Možemo koristiti Undertow's IdentityManager za ovo:

javna klasa CustomIdentityManager implementira IdentityManager {privatni korisnici karte; // standardni konstruktori @Preuzmi javnu provjeru računa (račun računa) {return account; } @Override javni račun provjeri (vjerodajnica) {return null; } @Override javni račun provjeri (ID niza, vjerodajnica) {Račun računa = getAccount (id); if (račun! = null && verifyCredential (račun, vjerodajnica)) {return account; } return null; }}

Jednom kada se kreira upravitelj identiteta, moramo stvoriti područje u kojem će se nalaziti korisničke vjerodajnice:

privatni statički HttpHandler addSecurity (HttpHandler toWrap, IdentityManager identityManager) {HttpHandler handler = toWrap; rukovatelj = novi AuthenticationCallHandler (rukovatelj); rukovatelj = novi AuthenticationConstraintHandler (rukovatelj); Popis mehanizama = Collections.singletonList (novi BasicAuthenticationMechanism ("Baeldung_Realm")); handler = novi AuthenticationMechanismsHandler (rukovatelj, mehanizmi); rukovatelj = novi SecurityInitialHandler (AuthenticationMode.PRO_ACTIVE, identityManager, handler); povratnik; }

Ovdje smo koristili AuthenticationMode kao PRO_AKTIVNO što znači da će svaki zahtjev koji dođe na ovaj poslužitelj biti proslijeđen definiranim mehanizmima za provjeru autentičnosti kako bi se autentifikacija izvršila željno.

Ako definiramo AuthenticationMode kao CONSTRAINT_DRIVEN, tada će samo oni zahtjevi proći kroz definirane mehanizme provjere autentičnosti gdje se pokreću ograničenja koja nalažu provjeru autentičnosti.

Sada samo trebamo mapirati ovo područje i upravitelj identiteta sa poslužiteljem prije nego što počne:

public static void main (String [] args) {Korisnici mape = novi HashMap (2); users.put ("root", "password" .toCharArray ()); users.put ("admin", "lozinka" .toCharArray ()); IdentityManager idm = novi CustomIdentityManager (korisnici); Undertow poslužitelj = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (addSecurity (e -> setExchange (e), idm)). Build (); server.start (); } privatna statička praznina setExchange (HttpServerExchange razmjena) {SecurityContext context = exchange.getSecurityContext (); exchange.getResponseSender (). send ("Hello" + context.getAuthenticatedAccount (). getPrincipal (). getName (), IoCallback.END_EXCHANGE); }

Ovdje smo stvorili dvije instance korisnika s vjerodajnicama. Nakon što poslužitelj ustane, da bismo mu pristupili, trebamo upotrijebiti bilo koju od ove dvije vjerodajnice.

3.4. Web utičnica

Jednostavno je stvoriti kanal za razmjenu web utičnica UnderTow's WebSocketHttpExchange API.

Na primjer, možemo otvoriti utični komunikacijski kanal na putu baeldungApp sa ispod isječka koda:

javna statička void glavna (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (path (). addPrefixPath ("/ baeldungApp", websocket ((exchange, channel) - > {channel.getReceiveSetter (). set (getListener ()); channel.resumeReceives ();})). addPrefixPath ("/", resource (new ClassPathResourceManager (SocketServer.class.getClassLoader (), SocketServer.class.getPacka ))). addWelcomeFiles ("index.html"))) .build (); server.start (); } privatni statički AbstractReceiveListener getListener () {povratak novog AbstractReceiveListener () {@Override zaštićena praznina onFullTextMessage (kanal WebSocketChannel, poruka BufferedTextMessage) {String messageData = message.getData (); for (WebSocketChannel session: channel.getPeerConnections ()) {WebSockets.sendText (messageData, session, null); }}}; }

Možemo stvoriti HTML stranicu s imenom index.html i koristite JavaScript WebSocket API za povezivanje s ovim kanalom.

3.5. Datotečni poslužitelj

S Undertow, također možemo stvoriti datotečni poslužitelj koji može prikazati sadržaj direktorija i izravno poslužuje datoteke iz direktorija:

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

Za prikaz sadržaja direktorija ne trebamo stvarati sadržaj korisničkog sučelja. Izvan kutije Undertow pruža stranicu za ovu funkciju prikaza.

4. Dodatak za proljetno pokretanje

Osim Mačak i Brana,Proljetni čizme podupire UnderTow kao ugrađeni spremnik za servlet. Koristiti Undertow, moramo dodati sljedeću ovisnost u pom.xml:

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

Najnovija verzija Dodatak Spring Boot Undertow dostupan je u središnjem spremištu Maven.

5. Zaključak

U ovom smo članku saznali više o Undertow i kako pomoću njega možemo stvoriti različite vrste poslužitelja.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.