WebFlux 的 ServerWebExchange
ServerWebExchange 的注释:
提示
ServerWebExchange 是『Spring Reactive Web 世界中』HTTP 请求与响应交互的契约。提供对 HTTP 请求和响应的访问,并公开额外的服务器端处理相关属性和特性,如请求属性。
其实,ServerWebExchange 命名为『服务网络交换器』,存放着重要的请求-响应属性、请求实例和响应实例等等,有点像 Servlet 中的 Context 的角色。
public interface ServerWebExchange {
// 日志前缀属性的 KEY,值为 org.springframework.web.server.ServerWebExchange.LOG_ID
// 可以理解为 attributes.set("org.springframework.web.server.ServerWebExchange.LOG_ID", "日志前缀的具体值");
// 作用是打印日志的时候会拼接这个 KEY 对应的前缀值,默认值为 ""
String LOG_ID_ATTRIBUTE = ServerWebExchange.class.getName() + ".LOG_ID";
String getLogPrefix();
// 获取 ServerHttpRequest 对象
ServerHttpRequest getRequest();
// 获取 ServerHttpResponse 对象
ServerHttpResponse getResponse();
// 返回当前 exchange 的请求属性,返回结果是一个可变的 Map
Map<String, Object> getAttributes();
// 根据 KEY 获取请求属性
@Nullable
default <T> T getAttribute(String name) {
return (T) getAttributes().get(name);
}
// 根据 KEY 获取请求属性,做了非空判断
@SuppressWarnings("unchecked")
default <T> T getRequiredAttribute(String name) {
T value = getAttribute(name);
Assert.notNull(value, () -> "Required attribute '" + name + "' is missing");
return value;
}
// 根据 KEY 获取请求属性,需要提供默认值
@SuppressWarnings("unchecked")
default <T> T getAttributeOrDefault(String name, T defaultValue) {
return (T) getAttributes().getOrDefault(name, defaultValue);
}
// 返回当前请求的网络会话
Mono<WebSession> getSession();
// 返回当前请求的认证用户,如果存在的话
<T extends Principal> Mono<T> getPrincipal();
// 返回请求的表单数据或者一个空的 Map,只有 Content-Type为application/x-www-form-urlencoded 的时候这个方法才会返回一个非空的 Map -- 这个一般是表单数据提交用到
Mono<MultiValueMap<String, String>> getFormData();
// 返回 multipart 请求的 part 数据或者一个空的 Map,只有 Content-Type 为 multipart/form-data 的时候这个方法才会返回一个非空的 Map -- 这个一般是文件上传用到
Mono<MultiValueMap<String, Part>> getMultipartData();
// 返回 Spring 的上下文
@Nullable
ApplicationContext getApplicationContext();
// 这几个方法和 lastModified 属性相关
boolean isNotModified();
boolean checkNotModified(Instant lastModified);
boolean checkNotModified(String etag);
boolean checkNotModified(@Nullable String etag, Instant lastModified);
// URL 转换
String transformUrl(String url);
// URL 转换映射
void