接口疑问?
来源:16-6 登录token超时优化

慕神4535282
2020-11-04
老师,下午好,请教一个问题,
public class LoginAdminGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
....
if (token == null || token.isEmpty()) {
LOG.info("token为空,请求被拦截");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
...
}
}
请问一下老师,这里 exchange.getResponse() 的返回值 是interface ServerHttpResponse类型,为什么可以 .setStatusCode(HttpStatus.UNAUTHORIZED); 呢?
我知道老师你已经答过了,我也按照你的方法做了,还是不能解答我的疑问。
我的疑问是 exchange.getResponse() 的返回值 是interface, 而不是 class,这时是没办法实例化一个 interface的呀,怎么可以调用它的setStatusCode()呢, setStatusCode()方法还没有实现呀?
谢谢老师解答 !
写回答
1回答
-
这个接口有相应的实现类,具体可以去研究它的源码。实际执行是实现类来执行。
面向接口编程。有很多类似的例子,比如打日志,我们所有LOG.info,你点进info,可以看到它也是个接口,slf4j实际就是定义了一套接口,内部的实现可以配置成logback或log4j
012020-11-04