在SparkJava中为静态文件添加`before`过滤器

时间:2016-07-01 22:47:29

标签: java spark-java

我在Spark应用程序中指定了静态文件的位置:

Spark.staticFileLocation("/public")

现在我想为某些文件添加过滤器(例如出于安全目的),但它不起作用:

Spark.before("/admin.html", myFilter);

但是,对于非静态映射,它确实有效。是否可以为静态文件配置这样的过滤器?

换句话说,Spark保护静态文件(如管理页面模板)的最佳做法是什么,不经过身份验证就可以公开?

1 个答案:

答案 0 :(得分:9)

您可以使用Spark StaticFilesConfiguration,但不要使用内置接线。 Spark.staticFileLocation("/public")在检查任何其他过滤器或路由之前创建并发送响应。试试这个:

package web;

import spark.Service;
import spark.staticfiles.StaticFilesConfiguration;

public class ServerExample {

    public ServerExample() {
        Service service = Service.ignite();
        service.port(1234);

        // All other filters first
        service.before((request, response) -> { /* Authentication filter */ });
        service.before("/admin.html", (request, response) ->
                service.halt(401, "Nothing to see here"));
        service.before((request, response) -> { /* Some other filter */ });

        // Static files filter is LAST
        StaticFilesConfiguration staticHandler = new StaticFilesConfiguration();
        staticHandler.configureExternal("/path/to/static/files/");
        service.before((request, response) ->
                staticHandler.consume(request.raw(), response.raw()));

        // All your routes (are belong to us)
        service.get("/", (req, res) -> "Hello world");
        service.get("/health", (req, res) -> "Peachy");
    }

    public static void main(String[] args) {
        new ServerExample();
    }
}

长期来看,你可能想要提供来自Nginx或Apache的静态文件,如果你真的成功了,那就是CDN:)