掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
環(huán)境:Springboot2.4.12

固原ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
spring-web模塊包含了對響應式web應用程序的以下基本支持:
HttpHandler是一個簡單的協(xié)議,只有一個方法來處理請求和響應。它故意最小化,其主要和唯一的目的是在不同的HTTP服務器api上提供最小的抽象。
支持的服務器api如下表所示:
|
服務器 |
服務的API |
反應式流支持 |
|
Netty |
Netty API |
Reactor Netty |
|
Undertow |
Undertow API |
spring-web: Undertow到Reactive Streams橋接 |
|
Tomcat |
Servlet 3.1 non-blocking I/O; Tomcat API to read and write ByteBuffers vs byte[] |
spring-web:Servlet 3.1非阻塞 I/O到Reactive Streams橋接 |
|
Jetty |
Servlet 3.1 non-blocking I/O; Jetty API to write ByteBuffers vs byte[] |
spring-web:Servlet 3.1非阻塞 I/O到Reactive Streams橋接 |
|
Servlet 3.1 container |
Servlet 3.1 non-blocking I/O |
spring-web: Servlet 3.1非阻塞 I/O到Reactive Streams橋接 |
下表描述了服務器依賴關系:
|
服務器 |
Group id |
Artifact name |
|
Reactor Netty |
io.projectreactor.netty |
reactor-netty |
|
Undertow |
io.undertow |
undertow-core |
|
Tomcat |
org.apache.tomcat.embed |
tomcat-embed-core |
|
Jetty |
org.eclipse.jetty |
jetty-server, jetty-servlet |
下面的代碼片段顯示了在每個服務器API中使用HttpHandler適配器:
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create().host(host).port(port).handle(adapter).bind().block();
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
UndertowHttpHandlerAdapter adapter = new UndertowHttpHandlerAdapter(handler);
Undertow server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build();
server.start();
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
Servlet servlet = new TomcatHttpHandlerAdapter(handler);
Tomcat server = new Tomcat();
File base = new File(System.getProperty("java.io.tmpdir"));
Context rootContext = server.addContext("", base.getAbsolutePath());
Tomcat.addServlet(rootContext, "main", servlet);
rootContext.addServletMappingDecoded("/", "main");
server.setHost(host);
server.setPort(port);
server.start();
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
Servlet servlet = new JettyHttpHandlerAdapter(handler);
Server server = new Server();
ServletContextHandler contextHandler = new ServletContextHandler(server, "");
contextHandler.addServlet(new ServletHolder(servlet), "/");
contextHandler.start();
ServerConnector connector = new ServerConnector(server);
connector.setHost(host);
connector.setPort(port);
server.addConnector(connector);
server.start();
要將war部署到任何Servlet 3.1+容器,你可以擴展并在war中包含
AbstractReactiveWebInitializer。這個類用ServletHttpHandlerAdapter封裝了一個HttpHandler,并將其注冊為Servlet。
部分源碼:?
public abstract class AbstractReactiveWebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
String servletName = getServletName();
ApplicationContext applicationContext = createApplicationContext();
refreshApplicationContext(applicationContext);
registerCloseListener(servletContext, applicationContext);
// 與上面的服務器一樣通過WebHttpHandlerBuilder構建HttpHandler對象
HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
// 該類實現(xiàn)了javax.servlet.Servlet接口
ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler);
ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, servlet);
registration.setLoadOnStartup(1);
registration.addMapping(getServletMapping());
registration.setAsyncSupported(true);
}
}org.springframework.web.server包構建在HttpHandler契約之上,為通過多個WebExceptionHandler、多個WebFilter和單個WebHandler組件的鏈處理請求提供通用的web API。只需指向自動檢測組件的Spring ApplicationContext,或者向構建器注冊組件,就可以將該鏈與WebHttpHandlerBuilder組合在一起。
HttpHandler的目標很簡單,就是抽象出不同的HTTP服務器,而WebHandler API的目標是提供web應用中常用的更廣泛的功能,例如:
特殊bean類型
下表列出了WebHttpHandlerBuilder可以在Spring ApplicationContext中自動檢測或直接注冊的組件:
|
Bean name |
Bean type |
Count |
Description |
|
|
WebExceptionHandler |
0..N |
為來自WebFilter實例鏈和目標WebHandler的異常提供處理。 |
|
|
WebFilter |
0..N |
在過濾器鏈的其余部分和目標WebHandler的前后應用攔截樣式邏輯。 |
|
webHandler |
WebHandler |
1 |
請求處理程序。 |
|
webSessionManager |
WebSessionManager |
0..1 |
通過ServerWebExchange上的方法公開的WebSession實例管理器。默認為DefaultWebSessionManager。 |
|
serverCodecConfigurer |
ServerCodecConfigurer |
0..1 |
用于訪問HttpMessageReader實例,解析表單數(shù)據(jù)和multipart數(shù)據(jù),然后通過ServerWebExchange上的方法公開這些數(shù)據(jù)。默認情況下是servercodecconfiguration.create()。 |
|
localeContextResolver |
LocaleContextResolver |
0..1 |
LocaleContext的解析器通過ServerWebExchange上的方法公開。默認為AcceptHeaderLocaleContextResolver。 |
|
forwardedHeaderTransformer |
ForwardedHeaderTransformer |
0..1 |
對于處理轉發(fā)的類型頭,可以提取并刪除它們,也可以只刪除它們。默認不使用。 |
Form Data
ServerWebExchange公開了以下訪問表單數(shù)據(jù)的方法:
Mono> getFormData();
DefaultServerWebExchange使用配置的HttpMessageReader將表單數(shù)據(jù)(
application/x-www-form-urlencoded)解析為MultiValueMap。默認情況下,F(xiàn)ormHttpMessageReader被配置為由ServerCodecConfigurer bean使用。
Multipart Data
ServerWebExchange公開了以下訪問多部分數(shù)據(jù)的方法:
Mono> getMultipartData();
DefaultServerWebExchange使用配置的HttpMessageReader
要以流式方式解析多部分數(shù)據(jù),你可以使用HttpMessageReader
在WebHandler API中,你可以使用WebFilter在過濾器和目標WebHandler處理鏈的其余部分之前和之后應用攔截風格的邏輯。當使用WebFlux配置時,注冊WebFilter就像把它聲明為Spring bean一樣簡單,并且(可選地)通過在bean聲明上使用@Order或實現(xiàn)Ordered來表示優(yōu)先級。
在WebHandler API中,可以使用WebExceptionHandler來處理來自WebFilter實例鏈和目標WebHandler的異常。當使用WebFlux配置時,注冊WebExceptionHandler就像聲明它為Spring bean一樣簡單,并且(可選)通過在bean聲明上使用@Order或實現(xiàn)Ordered來表示優(yōu)先級。
下表描述了可用的WebExceptionHandler實現(xiàn):
|
Exception Handler |
Description |
|
ResponseStatusExceptionHandler |
通過將響應設置為異常的HTTP狀態(tài)碼,提供對ResponseStatusException類型異常的處理。 |
|
WebFluxResponseStatusExceptionHandler |
擴展了ResponseStatusExceptionHandler,它還可以確定任何異常的@ResponseStatus注解的HTTP狀態(tài)碼。 這個處理程序是在WebFlux配置中聲明的。 |
spring-web和spring-core模塊通過非阻塞I/O提供響應式流回壓,支持序列化和反序列化與高層對象之間的字節(jié)內容。下面介紹這種支持:
spring-core模塊提供了byte[]、ByteBuffer、DataBuffer、Resource和String編碼器和解碼器的實現(xiàn)。spring-web模塊提供了Jackson JSON、Jackson Smile、JAXB2、Protocol buffer和其他Encoder和Decoder,以及針對表單數(shù)據(jù)、多部分內容、服務器發(fā)送事件等只支持web的HTTP消息閱讀器和writer實現(xiàn)。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流