环境:Springboot2.4.12

固原ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
spring-web模块包含了对响应式web应用程序的以下基本支持:
HttpHandler是一个简单的协议,只有一个方法来处理请求和响应。它故意最小化,其主要和唯一的目的是在不同的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();
    // 该类实现了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实例,解析表单数据和multipart数据,然后通过ServerWebExchange上的方法公开这些数据。默认情况下是servercodecconfiguration.create()。  | 
| 
 localeContextResolver  | 
 LocaleContextResolver  | 
 0..1  | 
 LocaleContext的解析器通过ServerWebExchange上的方法公开。默认为AcceptHeaderLocaleContextResolver。  | 
| 
 forwardedHeaderTransformer  | 
 ForwardedHeaderTransformer  | 
 0..1  | 
 对于处理转发的类型头,可以提取并删除它们,也可以只删除它们。默认不使用。  | 
Form Data
ServerWebExchange公开了以下访问表单数据的方法:
Mono> getFormData(); 
DefaultServerWebExchange使用配置的HttpMessageReader将表单数据(
application/x-www-form-urlencoded)解析为MultiValueMap。默认情况下,FormHttpMessageReader被配置为由ServerCodecConfigurer bean使用。
Multipart Data
ServerWebExchange公开了以下访问多部分数据的方法:
Mono> getMultipartData(); 
DefaultServerWebExchange使用配置的HttpMessageReader
要以流式方式解析多部分数据,你可以使用HttpMessageReader
在WebHandler API中,你可以使用WebFilter在过滤器和目标WebHandler处理链的其余部分之前和之后应用拦截风格的逻辑。当使用WebFlux配置时,注册WebFilter就像把它声明为Spring bean一样简单,并且(可选地)通过在bean声明上使用@Order或实现Ordered来表示优先级。
在WebHandler API中,可以使用WebExceptionHandler来处理来自WebFilter实例链和目标WebHandler的异常。当使用WebFlux配置时,注册WebExceptionHandler就像声明它为Spring bean一样简单,并且(可选)通过在bean声明上使用@Order或实现Ordered来表示优先级。
下表描述了可用的WebExceptionHandler实现:
| 
 Exception Handler  | 
 Description  | 
| 
 ResponseStatusExceptionHandler  | 
 通过将响应设置为异常的HTTP状态码,提供对ResponseStatusException类型异常的处理。  | 
| 
 WebFluxResponseStatusExceptionHandler  | 
 扩展了ResponseStatusExceptionHandler,它还可以确定任何异常的@ResponseStatus注解的HTTP状态码。 这个处理程序是在WebFlux配置中声明的。  | 
spring-web和spring-core模块通过非阻塞I/O提供响应式流回压,支持序列化和反序列化与高层对象之间的字节内容。下面介绍这种支持:
spring-core模块提供了byte[]、ByteBuffer、DataBuffer、Resource和String编码器和解码器的实现。spring-web模块提供了Jackson JSON、Jackson Smile、JAXB2、Protocol buffer和其他Encoder和Decoder,以及针对表单数据、多部分内容、服务器发送事件等只支持web的HTTP消息阅读器和writer实现。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号