Pengenalan JBoss Undertow

1. Gambaran keseluruhan

Undertow adalah pelayan web yang sangat ringan dan berprestasi tinggi dari JBoss . Ia menyokong API menyekat dan tidak menyekat dengan NIO .

Oleh kerana ia ditulis adalah Java, ia dapat digunakan dalam aplikasi berbasis JVM dalam mod tertanam, bahkan pelayan WilfFly JBoss secara internal menggunakan Undertow untuk meningkatkan prestasi pelayan.

Dalam tutorial ini, kami akan menunjukkan ciri-ciri Undertow dan cara menggunakannya.

2. Mengapa Dibawah?

  • Ringan: Undertow sangat ringan di bawah 1MB. Dalam mod terbenam, ia hanya menggunakan ruang timbunan 4MB pada waktu runtime
  • Servlet 3.1: Ia menyokong sepenuhnya Servlet 3.1
  • Soket Web: Ini menyokong fungsi Soket Web (termasuk JSR-356 )
  • Sambungan Tetap: Secara lalai, Undertow merangkumi sambungan berterusan HTTP dengan menambahkan tajuk respons terus-hidup . Ini membantu klien yang menyokong sambungan berterusan untuk mengoptimumkan prestasi dengan menggunakan kembali butiran sambungan

3. Menggunakan Undertow

Mari mula menggunakan Undertow dengan membuat pelayan web mudah.

3.1. Ketergantungan Maven

Untuk menggunakan Undertow , kita perlu menambahkan kebergantungan berikut ke pom.xml kami :

 io.undertow undertow-servlet 1.4.18.Final 

Untuk membina balang yang dapat dikendalikan, kita juga perlu menambahkan plugin naven-shadow. Itulah sebabnya kami juga perlu menambahkan konfigurasi di bawah:

 org.apache.maven.plugins maven-shade-plugin   package  shade    

Versi terbaru Undertow boleh didapati di Central Maven Repository.

3.2. Pelayan Mudah

Dengan coretan kod di bawah, kita dapat membuat pelayan web sederhana menggunakan Undertow's Builder 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(); } }

Di sini, kami telah menggunakan Builder API untuk mengikat port 8080 ke pelayan ini. Juga, perhatikan bahawa kami telah menggunakan ungkapan lambda untuk menggunakan pengendali.

Kita juga boleh menggunakan coretan kod di bawah untuk melakukan perkara yang sama tanpa menggunakan ungkapan 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();

Perkara penting yang perlu diberi perhatian di sini ialah penggunaan HttpHandler API. Ini adalah plugin terpenting untuk menyesuaikan aplikasi Undertow berdasarkan keperluan kami.

Dalam kes ini, kami telah menambahkan pengendali khusus yang akan menambahkan tajuk Jenis Isi: teks / respons biasa dengan setiap permintaan.

Dengan cara yang sama, jika kita ingin mengembalikan beberapa teks lalai dengan setiap respons, kita dapat menggunakan potongan kode di bawah:

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

3.3. Akses Selamat

Dalam kebanyakan kes, kami tidak membenarkan semua pengguna mengakses pelayan kami. Biasanya, pengguna dengan kelayakan yang sah dapat memperoleh akses. Kami dapat menerapkan mekanisme yang sama dengan Undertow .

Untuk melaksanakannya, kita perlu membuat pengurus identiti yang akan memeriksa keaslian pengguna untuk setiap permintaan.

Kita boleh menggunakan Undertow's IdentityManager untuk ini:

public class CustomIdentityManager implements IdentityManager { private Map users; // standard constructors @Override public Account verify(Account account) { return account; } @Override public Account verify(Credential credential) { return null; } @Override public Account verify(String id, Credential credential) { Account account = getAccount(id); if (account != null && verifyCredential(account, credential)) { return account; } return null; } }

Sebaik sahaja pengurus identiti dibuat, kita perlu membuat dunia yang akan menyimpan kelayakan pengguna:

private static HttpHandler addSecurity( HttpHandler toWrap, IdentityManager identityManager) { HttpHandler handler = toWrap; handler = new AuthenticationCallHandler(handler); handler = new AuthenticationConstraintHandler(handler); List mechanisms = Collections.singletonList( new BasicAuthenticationMechanism("Baeldung_Realm")); handler = new AuthenticationMechanismsHandler(handler, mechanisms); handler = new SecurityInitialHandler( AuthenticationMode.PRO_ACTIVE, identityManager, handler); return handler; }

Di sini, kami telah menggunakan AuthenticationMode sebagai PRO_ACTIVE yang bermaksud setiap permintaan yang datang ke pelayan ini akan diteruskan ke mekanisme pengesahan yang ditentukan untuk melakukan pengesahan dengan bersemangat.

Sekiranya kita mendefinisikan AuthenticationMode sebagai CONSTRAINT_DRIVEN , maka hanya permintaan tersebut yang akan melalui mekanisme pengesahan yang ditentukan di mana kekangan yang mewajibkan pengesahan dicetuskan.

Sekarang, kita hanya perlu memetakan wilayah ini dan pengurus identiti dengan pelayan sebelum bermula:

public static void main(String[] args) { Map users = new HashMap(2); users.put("root", "password".toCharArray()); users.put("admin", "password".toCharArray()); IdentityManager idm = new CustomIdentityManager(users); 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); }

Di sini, kami telah membuat dua contoh pengguna dengan tauliah. Setelah pelayan habis, untuk mengaksesnya, kita perlu menggunakan salah satu daripada dua kelayakan ini.

3.4. Soket Web

Sangat mudah untuk membuat saluran pertukaran soket web dengan UnderSow's WebSocketHttpExchange API.

Sebagai contoh, kita boleh membuka saluran komunikasi soket pada jalur baeldungApp dengan coretan kod di bawah:

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(WebSocketChannel channel, BufferedTextMessage message) { String messageData = message.getData(); for (WebSocketChannel session : channel.getPeerConnections()) { WebSockets.sendText(messageData, session, null); } } }; }

Kita dapat membuat laman HTML bernama index.html dan menggunakan API WebSocket JavaScript untuk menyambung ke saluran ini.

3.5. Pelayan Fail

Dengan Undertow , kita juga dapat membuat pelayan file yang dapat menampilkan isi direktori dan langsung melayani file dari direktori:

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

Kami tidak perlu membuat kandungan UI untuk memaparkan kandungan direktori. Undertow di luar kotak menyediakan halaman untuk fungsi paparan ini.

4. Spring Boot Plugin

Selain dari Tomcat dan Jetty, Spring Boot menyokong UnderTow sebagai wadah servlet tertanam. Untuk menggunakan Undertow , kita perlu menambahkan kebergantungan berikut di pom.xml:

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

Versi terbaru plugin Spring Boot Undertow boleh didapati di Central Maven Repository.

5. Kesimpulan

Dalam artikel ini, kami belajar mengenai Undertow dan bagaimana kami dapat membuat pelbagai jenis pelayan dengannya.

Seperti biasa, kod sumber penuh boleh didapati di GitHub.