我有一个特定的过滤器可以检索并形成一个实体,UserState我怎样才能将此实体添加到上下文中,以便我可以在以下过滤器中使用它而不是重新形成它?或者还有其他一些在过滤器之间传递对象的做法吗?
public class AuthFilter extends ZuulFilter {
@Autowired
private AuthService authService;
@Autowired
private ApplicationContext appContext;
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 2;
}
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
String requestURI = context.getRequest().getRequestURI();
for (String authPath : authPaths) {
if (requestURI.contains(authPath)) return true;
}
return false;
}
@Override
public Object run() throws ZuulException {
try {
UserState userState = authService.getUserData();
DefaultListableBeanFactory context = new DefaultListableBeanFactory();
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(UserState.class);
beanDefinition.setPropertyValues(new MutablePropertyValues() {
{
add("user", userState);
}
});
context.registerBeanDefinition("userState", beanDefinition);
} catch (UndeclaredThrowableException e) {
if (e.getUndeclaredThrowable().getClass() == UnauthorizedException.class) {
throw new UnauthorizedException(e.getMessage());
}
if (e.getUndeclaredThrowable().getClass() == ForbiddenException.class) {
throw new ForbiddenException(e.getMessage(), "The user is not allowed to make this request");
}
}
return null;
}
}
无需直接使用上下文。您可以在 Spring 的摆布下进行创作,并且仅将其填充到过滤器中。或者创建一个带有弹簧的对象 - 对象的存储,并在过滤器中将必要的对象放入其中。如果它需要绑定到会话,则通过会话 bean 工作。