使用 Spring Boot 内嵌容器 Undertow创建服务器的方法

 更新时间:2017年11月06日 09:47:38   投稿:mrr  
Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。接下来通过本文给大家介绍使用Spring Boot 内嵌容器 Undertow创建服务器的方法,感兴趣的朋友一起看看吧

Undertow是一个Web服务器,那么它就需要具备的现代Web服务器的基本特性,比如Servlet,JSP,文件服务器,代理服务器,安全认证等。undertow目前已经实现了绝大多数功能,并且因为wildfly通过了JavaEE7 TCK认证,所以可以说Undertow是一个通过Servlet 3.1认证的Web服务器和容器。这篇文章只分析Undertow的主干流程上的主要功能,即undertow-core和undertow-servlet。

1、简介

Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。

由于它是用Java写的,所以它可以被那些JVM-based 的应用通过内嵌的方式来使用。甚至JBoss的WilfFly服务器在内部使用Undertow来提高服务器的性能。

在本文中,我们将介绍Undertow的主要功能并给出使用代码。

2. 为什么要选择Undertow?

  • 轻量级 :Undertow 是非常小的,只有不到1MB。在内嵌模式下,运行时只占heap空间的4MB左右。
  • Servlet 3.1:完美支持 Servlet 3.1
  • Web Socket :支持 Web Socket (包括JSR-356)
  • 长连接 :默认情况下 ,Undertow 通过添加keep-alive 的response header来支持长连接。它通过重用连接信息(connection details)来改善长连接的性能。

3. 使用Undertow

不多说,让我们使用Undertow来创建一个简单的web server吧!

3.1. Maven 依赖

加入如下依赖:

要构建一个可运行的jar,我们还需要添加一个maven-shade-plugin。像下面这样:

最新版的Undertow已经放到了maven 中央仓库,随便玩耍吧。

3.2. 简单的Server

仅仅需要下面的几行代码,就可以创建一个简单的web server,Undertow的入口使用的是Builder API。

这里我们使用Builder API把server绑定到8080端口上。同时我们使用了lambda表达式配置了一个handler。你也可以不用lambda表达式做同样的事情:

最主要的事情就是这里对HttpHandler API的使用。这个是根据我们的需要定制Undertow应用程序的最重要的武器。

在这里,我们添加了一个自定义的handler,逻辑就是让每个request都有一个Content-Type: text/plain response header。

同样的,如果你想让每个response都返回默认的text文本,你可以像下面这样来定义:

3.3.安全访问

在大多数情况下,我们不希望所有的用户都可以访问我们的server。通常,只有那些携带了合法“护照”的才可以访问。在Undertow上,我们同样可以实现这样的机制。

要想实现这个,我们只需要创建一个认证管理器,这个管理器会检查每个请求的用户信息。

下面我们就来实现一个自定义的IdentityManager:

一旦认证mananger被创建,我们需要创建一个“领地”来保存用户的信息。

这里我们使用了 AuthenticationMode.PRO_ACTIVE,表示每个来到这个server的请求都将会经过我们指定的认证机制来踊跃的进行认证。

如果我们使用了AuthenticationMode.CONSTRAINT_DRIVEN模式,那么只有那些被明确要求过滤的请求才会经过认证机制。

现在,我们只需要把保存用户信息的“领地”和认证管理器关联起来就可以了。

截止目前,我们已经创建了两个用户实例。一旦server启动了以后,要想访问,我们就需要使用这个两个证书才行。

3.4. Web Socket

使用Undertow的WebSocketHttpExchange API创建web socket exchange channel 同样非常简单。

下面,我们就打开一个socket通信channel,在/importsourceApp path上:

然后我们就可以创建一个HTML页面 index.html,然后使用js的WebSocket API来连接到这个channel上了。

3.5. File Server

使用Undertow,我们也可以创建一个文件服务器(file server),它可以显示目录内容,并直接从目录中提供文件:

你甚至都不需要穿件任何UI来显示目录。Undertow 为你提供了一个开箱即用的页面。

4. Spring Boot Plugin

Spring Boot把Undertow也内嵌进去了,作为继Tomcat和Jetty之后第三个内嵌的servlet 容器。要想在Spring Boot中使用Undertow只需要加下面的依赖就是了:

5. 总结

在本文中,我们了解了Undertow以及如何使用它创建不同类型的服务器。

以上所述是小编给大家介绍的Spring Boot 内嵌容器 Undertow,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • IDEA报java: java.lang.OutOfMemoryError: Java heap space错误解决办法

    IDEA报java: java.lang.OutOfMemoryError: Java heap space错误

    这篇文章主要给大家介绍了关于IDEA报java: java.lang.OutOfMemoryError: Java heap space错误的解决办法,文中将解决的办法介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java对类私有变量的暴力反射技术讲解

    Java对类私有变量的暴力反射技术讲解

    今天小编就为大家分享一篇关于Java对类私有变量的暴力反射技术讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 解决spring-boot2.0.6中webflux无法获得请求IP的问题

    解决spring-boot2.0.6中webflux无法获得请求IP的问题

    这几天在用 spring-boot 2 的 webflux 重构一个工程,写到了一个需要获得客户端请求 IP 的地方,在写的过程中遇到很多问题,下面小编通过一段代码给大家介绍解决spring-boot2.0.6中webflux无法获得请求IP的问题,感兴趣的朋友跟随小编一起看看吧
    2018-10-10
  • java 之JNA中的Memory和Pointer的使用方法

    java 之JNA中的Memory和Pointer的使用方法

    这篇文章主要介绍了java 之JNA中的Memory和Pointer的使用方法,文章基于Java的相关自来哦展开对Pointer和Memory的使用介绍,需要的小伙伴可以参考一下
    2022-04-04
  • Java递归方法实现山脉绘制

    Java递归方法实现山脉绘制

    这篇文章主要为大家详细介绍了Java递归方法实现山脉绘制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java9中新增的Collector收集器

    Java9中新增的Collector收集器

    这篇文章主要介绍了Java9中新增的Collector收集器,Collector作为收集器,简单来说就是将数据或元素收集到一起,并且flatMapping与收集器结合使用,通过提供智能元素集合进行分组。下文相关介绍需要的小伙伴可以参考一下
    2022-06-06
  • 深入理解Mybatis中的resultType和resultMap

    深入理解Mybatis中的resultType和resultMap

    这篇文章给大家介绍了mybatis中的resultType和resultMap的用法实例讲解,MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,至于两种用法区别,通过本文一起学习吧
    2016-09-09
  • Java编程中字节流与字符流IO操作示例

    Java编程中字节流与字符流IO操作示例

    这篇文章主要介绍了Java编程中字节流与字符流IO操作示例,并且简单总结了IO流操作的基本规律,需要的朋友可以参考下
    2016-02-02
  • java处理异常的机制关键字throw和throws使用解析

    java处理异常的机制关键字throw和throws使用解析

    这篇文章主要介绍了java处理异常的机制关键字throw和throws使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Spring Boot利用@Async异步调用:使用Future及定义超时详解

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    这篇文章主要给大家介绍了关于Spring Boot利用@Async异步调用:使用Future及定义超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友可以参考下
    2018-05-05

最新评论