微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在早期的 servlet/spring boot 过滤器中强制结束过滤器链

如何解决如何在早期的 servlet/spring boot 过滤器中强制结束过滤器链

一个多租户应用程序,我想尽早结束没有租户的任何请求。

设置/场景

我使用 spring session 和 spring security 运行 spring boot (web)。

就我而言,我有多种策略来确定租户、TenantFromX、TenantFromY .. 都在订单 Ordered.HIGHEST_PRECEDENCE 上运行 - 尽可能早。

在订单 Ordered.HIGHEST_PRECEDENCE+1 上,我运行 TenantMustExistFilter 过滤器以验证任何策略确实匹配/找到租户定义

@Log4j2
@Component
@requiredArgsConstructor
// After TenantFromX(min) but before SessionRepositoryFilter(Session) which is min+50
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
public class TenantMandatoryFilter extends GenericFilterBean
{
  @Override
  public void doFilter(
    ServletRequest request,ServletResponse response,FilterChain filterChain
  ) throws servletexception,IOException
  {
    if (TenantStore.getinitMode().isEmpty()) {
      throw new NoTenantException("No tenant identified for request - request blocked");
    }

    try {
      filterChain.doFilter(request,response);
    } finally {
      TenantStore.clear();
    }
  }
}

问题/问题

即使我抛出了一个运行时异常 NoTenantException 在该过滤器之后的所有其他过滤器仍然被调用

例如,在 SessionRepositoryFilter调用 Ordered.HIGHEST_PRECEDENCE+50,然后触发弹簧安全 FilterProxyChain

TenantMandatoryFilter 验证失败后如何有效地停止链? 我预计 return; 或和 Exception 或只是不调用 filterChain.doFilter(request,response); 足以结束链执行。

我对这里的流程或想法有误解吗?

尝试

我可以通过替换成功结束链条

if (TenantStore.getinitMode().isEmpty()) {
  throw new NoTenantException("No tenant identified for request - request blocked");
}

if (TenantStore.getinitMode().isEmpty()) {
  response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
  return;
}

有趣的是,下面的内容不起作用,即使它在语义上看起来更正确。它不起作用意味着,它会在此之后调用 SessionRepositoryFilterFilterChainProxy

if (TenantStore.getinitMode().isEmpty()) {
  response.sendError(HttpServletResponse.SC_BAD_REQUEST,"Invalid tenant");
  return;
}

我认为这是因为 sendError 将响应设置为暂停以完成任何其他链(这是我不想要的)。

它似乎仍然不对,那么如何以正确的方式做到这一点?或者这完全是一个概念上的缺陷?

解决方法

通过显式调用或抛出异常发送错误,将导致请求被分派到应用程序的错误页面处理,后者将再次调用过滤器以进行该分派。设置状态是正确的做法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。