生活随笔
收集整理的這篇文章主要介紹了
webflux切面拦截权限,webflux整合aop,webflux获取request
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
背景
在springboot+tomcat應(yīng)用中獲取request對(duì)象可以使用RequestContextHolder.getRequestAttributes()的方式來(lái)獲取,此種方式的核心在于request所在容器被放在threadlocal中,但是webflux結(jié)合netty項(xiàng)目卻不能這么使用,因?yàn)閣ebflux是異步響應(yīng)式的,下面介紹下異步服務(wù)webflux+netty如何便捷獲取request。
編寫基于webflux的RequestContextHolder實(shí)現(xiàn)
編寫ReactiveHttpContextHolder類用來(lái)模擬RequestContextHolder
public class ReactiveHttpContextHolder {public static Mono<ServerHttpRequest> getRequest() {return Mono.subscriberContext().map(context
-> context
.get(Info.CONTEXT_KEY
).getRequest());}public static Mono<ServerHttpResponse> getResponse(){return Mono.subscriberContext().map(context
-> context
.get(Info.CONTEXT_KEY
).getResponse());}public static final class Info{public static final Class<ServerWebExchange> CONTEXT_KEY
= ServerWebExchange.class;}
}
編寫過(guò)濾器類用于設(shè)置request到容器中
@Component
@ConditionalOnWebApplication(type
= ConditionalOnWebApplication.Type.REACTIVE
)
public class AppFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange
, WebFilterChain chain
) {return chain
.filter(exchange
).subscriberContext(context
-> context
.put(ReactiveHttpContextHolder.Info.CONTEXT_KEY
, exchange
));}
}
編寫切面實(shí)現(xiàn)token攔截,校驗(yàn)權(quán)限
切面邏輯代碼
@Component
@Aspect
public class AuthAspect extends BaseController {@Pointcut("execution(public * xx.xx.xxController.*(..))")private void classRule(){}@Pointcut("@annotation(xx.AuthIgnore)")private void ignoreRule(){}@Around("classRule() && !ignoreRule()")public Mono<Object> aroundInvoke(ProceedingJoinPoint joinPoint
){Mono<ServerHttpRequest> requestMono
= ReactiveHttpContextHolder.getRequest();return requestMono
.flatMap(request
-> {String token
= getHeader("token", request
);if (token
== null || TokenCacheContainer.getTokenCache().get(token
) == null){BusException ex
= new BusException("01300001");return buildErrMsg(ex
);} else {try {return (Mono<Object>) joinPoint
.proceed();} catch (Throwable throwable
) {LogFactory.getLog(AuthAspect.class).error("", throwable
);BusException ex
= new BusException("01300000");return buildErrMsg(ex
);}}});}private Mono<String> buildErrMsg(BusException ex
){ApiJsonResult errResult
= ApiJsonResult.createErrResult(ex
.getErrorCode(), ex
.getReason(), ex
.getResolve());return Mono.just( errResult
.toString() );}
}
說(shuō)明
過(guò)濾器會(huì)在切面之前執(zhí)行,因此aop中能獲取到在filter中設(shè)置的request測(cè)試結(jié)果
總結(jié)
以上是生活随笔為你收集整理的webflux切面拦截权限,webflux整合aop,webflux获取request的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。