Spark WS Framework Filter被调用两次

Nat*_*ase 6 java rest spark-framework

我想使用前置过滤器来添加尾部斜杠以及前置过滤器来处理某些端点上的身份验证.

这是我的路由代码:

// Add filter to all requests which adds a trailing slash if it is missing //
before("*", Filters.addTrailingSlashes);
path("/api", () -> {
    // Authentication Intercept //
    before("/*", AuthenticationIntercept.authenticationIntercept);

    // Sampling Endpoints //
    get(Path.Web.SAMPLES_FETCH_LATEST, SamplingController.fetchLatestSamples, new JsonTransformer());
    get(Path.Web.SAMPLES_FETCH_FOR_DEVICE, SamplingController.getLatestSamplesForDevice, new JsonTransformer());
});
Run Code Online (Sandbox Code Playgroud)

然后我点击以下端点:

本地主机:4567/API /样品/ 10

会发生什么是首先调用addTrailingSlashes.然后调用身份验证过滤器,然后再次调用addTrailingSlashes,localhost:4567/api/samples/10 /作为请求端点,最后再次调用身份验证过滤器.

这是预期的行为吗?我想要发生的是,addTrailingSlashes一旦添加斜杠就被调用,然后转发请求一次,以便只调用一次身份验证过滤器.

任何想法都将非常感激.

谢谢,内森

小智 2

我有同样的问题,但使用的是另一种类型的过滤器。事实证明,浏览器进行了两次调用,第二次调用是为了在根目录 (/favicon.ico) 上获取 favicon.ico,从而触发了过滤器。

我的应用程序的根路径上没有配置任何服务,因此似乎所有调用都会触发过滤器,即使是那些未映射的调用。

我通过使用未映射的其他路径验证了这一点,请尝试以下操作:

http://yourdomain.com/aaa/bbb

这个调用也确实使我的过滤器触发了两次。第一个访问不存在的服务,第一个获得 favicon.ico。

使用 Fiddler 等 http 监控软件来查看进行了哪些调用会很有帮助。

检查过滤器中的图标大小写并忽略它非常容易。要检查是否调用了有效的服务,需要做更多的工作。也许有更好的方法来做到这一点。