Úvod do programu JBoss Undertow

1. Prehľad

Undertow je mimoriadne ľahký a vysoko výkonný webový server od spoločnosti JBoss. Podporuje blokujúce aj neblokujúce API pomocou NIO.

Pretože je napísaná ako Java, je možné ju použiť v akýchkoľvek aplikáciách založených na JVM v zabudovanom režime, dokonca aj v JBoss WilfFly server interne používa Spodný protiprúd na zlepšenie výkonu servera.

V tomto tutoriále si ukážeme funkcie Undertow a ako ich používať.

2. Prečo Undertow?

  • Ľahká váha: Spodný protiprúd je extrémne ľahký do 1 MB. V zabudovanom režime využíva za behu iba 4 MB haldy priestoru
  • Servlet 3.1: Plne podporuje Servlet 3.1
  • Web Socket: Podporuje funkčnosť Web Socket (vrátane JSR-356)
  • Trvalé pripojenie: Predvolene Spodný protiprúd zahŕňa trvalé pripojenia HTTP pridaním udržať nažive hlavička odpovede. Pomáha klientom, ktorí podporujú trvalé pripojenia, optimalizovať výkon opätovným použitím podrobností pripojenia

3. Používanie Undertow

Začnime používať Spodný protiprúd vytvorením jednoduchého webového servera.

3.1. Maven závislosť

Použit Spodný protiprúd, musíme k našej pridať nasledujúcu závislosť pom.xml:

 io.pod prúdom dolný servlet 1.4.18.Final 

Ak chcete vytvoriť spustiteľnú nádobu, musíme tiež pridať doplnok maven-shad. Preto musíme pridať aj konfiguráciu pod:

 org.apache.maven.plugins balíček balíka maven-shad-odtieň odtieň 

Najnovšia verzia servera Spodný protiprúd je k dispozícii v centrálnom úložisku Maven.

3.2. Jednoduchý server

Pomocou nasledujúceho útržku kódu môžeme vytvoriť jednoduchý webový server pomocou nástroja Undertow Staviteľ 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 (); }}

Tu sme použili Staviteľ API na viazanie 8080 port na tento server. Upozorňujeme tiež, že na použitie obslužnej rutiny sme použili výraz lambda.

Nižšie uvedený úryvok kódu môžeme použiť aj na to isté, bez použitia výrazov lambda:

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

Je dôležité si uvedomiť, že použitie HttpHandler API. Je to najdôležitejší doplnok na prispôsobenie Spodný protiprúd aplikácie na základe našich potrieb.

V tomto prípade sme pridali upravenú obslužnú rutinu, ktorá by pridala Typ obsahu: text / obyčajný hlavička odpovede s každou požiadavkou.

Podobným spôsobom, ak chceme pri každej odpovedi vrátiť nejaký predvolený text, môžeme použiť nasledujúci úryvok kódu:

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

3.3. Zabezpečený prístup

Vo väčšine prípadov neumožňujeme všetkým používateľom prístup na náš server. Spravidla môžu získať prístup používatelia s platnými povereniami. Rovnaký mechanizmus môžeme implementovať pomocou nástroja Spodný protiprúd.

Na jeho implementáciu musíme vytvoriť manažéra identít, ktorý bude pri každej žiadosti kontrolovať autenticitu používateľa.

Môžeme použiť Undertow's IdentityManager pre to:

verejná trieda CustomIdentityManager implementuje IdentityManager {súkromní používatelia mapy; // štandardné konštruktory @Override public Verifikácia účtu (Účet účtu) {návratový účet; } @Override verejné overenie účtu (poverenie poverenia) {return null; } @Override verejné overenie účtu (ID reťazca, poverenie poverenia) {Účet účtu = getAccount (ID); if (account! = null && verifyCredential (account, credential)) {return account; } return null; }}

Po vytvorení správcu identity musíme vytvoriť sféru, ktorá bude obsahovať poverenia používateľa:

súkromná statická HttpHandler addSecurity (HttpHandler toWrap, IdentityManager identityManager) {HttpHandler handler = toWrap; handler = new AuthenticationCallHandler (handler); handler = nový AuthenticationConstraintHandler (handler); Zoznam mechanizmov = Collections.singletonList (nový BasicAuthenticationMechanism ("Baeldung_Realm")); handler = new AuthenticationMechanismsHandler (obsluha, mechanizmy); handler = new SecurityInitialHandler (AuthenticationMode.PRO_ACTIVE, identityManager, handler); obsluha návratu; }

Tu sme použili AuthenticationMode ako PRO_AKTÍVNE čo znamená, že každá požiadavka prichádzajúca na tento server bude odoslaná definovaným mechanizmom autentifikácie, aby vykonali autentifikáciu nedočkavo.

Ak definujeme AuthenticationMode ako CONSTRAINT_DRIVEN, potom iba definované požiadavky prejdú cez definované mechanizmy autentifikácie, kde sa spustí obmedzenie, ktoré vyžaduje autentifikáciu.

Teraz stačí namapovať túto oblasť a správcu identít na server pred tým, ako sa spustí:

public static void main (String [] args) {Map users = new HashMap (2); users.put ("root", "heslo" .toCharArray ()); users.put ("admin", "heslo" .toCharArray ()); IdentityManager idm = nový CustomIdentityManager (používatelia); Undertow server = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (addSecurity (e -> setExchange (e), idm)). Build (); server.start (); } private static void setExchange (HttpServerExchange exchange) {SecurityContext context = exchange.getSecurityContext (); exchange.getResponseSender (). send ("Hello" + context.getAuthenticatedAccount (). getPrincipal (). getName (), IoCallback.END_EXCHANGE); }

Tu sme vytvorili dve inštancie používateľov s povereniami. Keď je server funkčný, na prístup k nemu musíme použiť ktorékoľvek z týchto dvoch poverení.

3.4. Webová zásuvka

Je ľahké vytvoriť výmenný kanál webových zásuviek pomocou UnderTow WebSocketHttpExchange API.

Napríklad môžeme otvoriť komunikačný kanál zásuvky na ceste baeldungApp s fragmentom kódu nižšie:

public static void main (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.getPackage ( ))). addWelcomeFiles ("index.html"))) .build (); server.start (); } private static AbstractReceiveListener getListener () {return new AbstractReceiveListener () {@Override protected void onFullTextMessage (kanál WebSocketChannel, správa BufferedTextMessage) {String messageData = message.getData (); pre (relácia WebSocketChannel: channel.getPeerConnections ()) {WebSockets.sendText (messageData, session, null); }}}; }

Môžeme vytvoriť stránku HTML s názvom index.html a používať JavaScript WebSocket API na pripojenie k tomuto kanálu.

3.5. Súborový server

S Spodný protiprúd, môžeme tiež vytvoriť súborový server, ktorý dokáže zobraziť obsah adresára a priamo obsluhuje súbory z adresára:

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

Na zobrazenie obsahu adresára nepotrebujeme vytvárať žiadny obsah používateľského rozhrania. Von z krabice Spodný protiprúd poskytuje stránku pre túto funkcionalitu zobrazenia.

4. Doplnok Spring Boot

Okrem toho Tomcat a Mólo,Jarná topánka podporuje Spodný protiprúd ako vložený kontajner servletu. Použit Spodný protiprúd, musíme pridať nasledujúcu závislosť do pom.xml:

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

Najnovšia verzia servera Doplnok Spring Boot Undertow je k dispozícii v centrálnom úložisku Maven.

5. Záver

V tomto článku sme sa dozvedeli o Spodný protiprúd a ako s ním môžeme vytvárať rôzne typy serverov.

Celý zdrojový kód je ako vždy k dispozícii na GitHub.


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