1.Gateway的拦截器
我们要在项目中实现一个拦截器,需要继承两个类:GlobalFilter, Ordered
Ordered:拦截器的顺序,不多说
于是一个简单的拦截器就有了
@Slf4j
@Componentpublic class AuthFilter implementsGlobalFilter, Ordered {@Overridepublic Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) {returnchain.filter(exchange);
}@Overridepublic intgetOrder() {return-10;
}
}
Gateway的核心接口:GatewayFilter,GlobalFilter,GatewayFilterChain。具体介绍:https://www.cnblogs.com/bjlhx/p/9786478.html
2.简介
我们在使用Spring Cloud Gateway的时候,注意到过滤器(包括GatewayFilter、GlobalFilter和过滤器链GatewayFilterChain),都依赖到ServerWebExchange。
这里的设计和Servlet中的Filter是相似的,当前过滤器可以决定是否执行下一个过滤器的逻辑,由GatewayFilterChain#filter()是否被调用来决定。而ServerWebExchange就相当于当前请求和响应的上下文。
ServerWebExchange实例不单存储了Request和Response对象,还提供了一些扩展方法,如果想实现改造请求参数或者响应参数,就必须深入了解ServerWebExchange。
3.ServerWebExchange
ServerWebExchange的注释: ServerWebExchange是一个HTTP请求-响应交互的契约。提供对HTTP请求和响应的访问,并公开额外的服务器端处理相关属性和特性,如请求属性。
其实,ServerWebExchange命名为服务网络交换器,存放着重要的请求-响应属性、请求实例和响应实例等等,有点像Context的角色。
3.1.所有接口
public interfaceServerWebExchange {//日志前缀属性的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
MapgetAttributes();//根据KEY获取请求属性
@Nullabledefault T getAttribute(String name) {return(T) getAttributes().get(name);
}//根据KEY获取请求属性,做了非空判断
@SuppressWarnings("unchecked")default T getRequiredAttribute(String name) {
T value=getAttribute(name);
Assert.notNull(value, ()-> "Required attribute '" + name + "' is missing");returnvalue;
}//根据KEY获取请求属性,需要提供默认值
@SuppressWarnings("unchecked")default T getAttributeOrDefault(String name, T defaultValue) {return(T) getAttributes().getOrDefault(name, defaultValue);
}//返回当前请求的网络会话
MonogetSession();//返回当前请求的认证用户,如果存在的话
MonogetPrincipal();//返回请求的表单数据或者一个空的Map,只有Content-Type为application/x-www-form-urlencoded的时候这个方法才会返回一个非空的Map -- 这个一般是表单数据提交用到
Mono>getFormData();//返回multipart请求的part数据或者一个空的Map,只有Content-Type为multipart/form-data的时候这个方法才会返回一个非空的Map -- 这个一般是文件上传用到
Mono>getMultipartData();//返回Spring的上下文
@Nullable
ApplicationContext getApplicationContext();//这几个方法和lastModified属性相关
booleanisNotModified();booleancheckNotModified(Instant lastModified);booleancheckNotModified(String etag);booleancheckNotModified(@Nullable String etag, Instant lastModified);//URL转换
String transformUrl(String url);//URL转换映射
void addUrlTransformer(Functiontransformer);//注意这个方法,方法名是:改变,这个是修改S