cloub spring 拦截器_SpringCloud:学习Gateway网关拦截器的ServerWebExchange

本文详细介绍了Spring Cloud Gateway中的ServerWebExchange,包括其作用、重要接口以及如何使用拦截器进行请求和响应的修改。讨论了ServerHttpRequest和ServerHttpResponse的接口方法,展示了如何通过GlobalFilter实现请求路径、请求数据、路由和响应体的修改。同时,对比了ServerWebExchange与Servlet在处理请求和响应时的区别。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值