使用 Spark Web 框架时如何使用原生 Servlet Filter?

2024-03-27

我正在玩Spark http://sparkjava.com/(Java Web 框架,而不是 Apache Spark)。

我发现定义路由和过滤器非常好且容易,但是我希望将本机 servlet 过滤器应用于我的路由,但似乎找不到方法来做到这一点。

更具体地说,我想使用Jetty 的 DoSFilter http://www.eclipse.org/jetty/documentation/current/dos-filter.html这是一个 servlet 过滤器(与 Spark Filter 定义对比)。由于 Spark 使用嵌入式 Jetty,因此我没有 web.xml 来注册 DoSFilter。但是,Spark 不公开服务器实例,因此我也找不到以编程方式注册过滤器的优雅方法。

有没有办法将本机 servlet 过滤器应用于我的路由?

我想过将 DoSFilter 包装在我自己的 Spark Filter 中,但这似乎是一个奇怪的想法。


你可以这样做:

public class App {
 private static Logger LOG = LoggerFactory.getLogger(App.class);

 public static void main(String[] args) throws Exception {

    ServletContextHandler mainHandler = new ServletContextHandler();
    mainHandler.setContextPath("/base/path");

    Stream.of(
            new FilterHolder(new MyServletFilter()),
            new FilterHolder(new SparkFilter()) {{
                this.setInitParameter("applicationClass", SparkApp.class.getName());
            }}
    ).forEach(h -> mainHandler.addFilter(h, "*", null));

    GzipHandler compression = new GzipHandler();
    compression.setIncludedMethods("GET");
    compression.setMinGzipSize(512);
    compression.setHandler(mainHandler);

    Server server = new Server(new ExecutorThreadPool(new ThreadPoolExecutor(10,200,60000,TimeUnit.MILLISECONDS,
                                                                          new ArrayBlockingQueue<>(200),
                                                                       new CustomizableThreadFactory("jetty-pool-"))));

    final ServerConnector serverConnector = new ServerConnector(server);
    serverConnector.setPort(9290);
    server.setConnectors(new Connector[] { serverConnector });

    server.setHandler(compression);
    server.start();

    hookToShutdownEvents(server);

    server.join();
}

private static void hookToShutdownEvents(final Server server) {
    LOG.debug("Hooking to JVM shutdown events");

    server.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {

        @Override
        public void lifeCycleStopped(LifeCycle event) {
            LOG.info("Jetty Server has been stopped");
            super.lifeCycleStopped(event);
        }

    });

    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            LOG.info("About to stop Jetty Server due to JVM shutdown");
            try {
                server.stop();
            } catch (Exception e) {
                LOG.error("Could not stop Jetty Server properly", e);
            }
        }
    });
}

/**
 * @implNote {@link SparkFilter} needs to access a public class
 */
@SuppressWarnings("WeakerAccess")
public static class SparkApp implements SparkApplication {

    @Override
    public void init() {
        System.setProperty("spring.profiles.active", ApplicationProfile.readProfilesOrDefault("dev").stream().collect(Collectors.joining()));
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ModocContext.class);
        ctx.registerShutdownHook();
    }

}} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spark Web 框架时如何使用原生 Servlet Filter? 的相关文章

随机推荐

  • 在 BIG QUERY 中进行透视时,行数据有空格时会出现错误。字段只能包含字母 数字 下划线 以字母或下划线开头

    我正在尝试使用下面的查询在大查询中进行旋转 select from SELECT desc qty RSN DESC FROM TABLE PIVOT SUM qty FOR RSN DESC IN Example1 Example2 Ex
  • 用于构建共享库的“soname”选项有什么用?

    我学到了 程序库指南 http tldp org HOWTO Program Library HOWTO 它提到使用soname像下面这样管理版本 gcc shared fPIC Wl soname libfoo so 1 o libfoo
  • Delphi Chromium Embedded - 清除浏览器缓存

    我在我的应用程序中使用 Delphi Chromium Embedded 我有以下问题 有没有办法清除浏览器缓存 我还尝试通过正确设置选项来不使用缓存 我将两个选项 页面和应用程序缓存 设置为 禁用 但我的页面仍然在使用缓存 我找到的解决方
  • C++ constexpr:在编译时计算 std 数组

    我想转换一个 数组 bool到一个整数序列 所以我需要计算一个std array在编译时 这是我的代码 include
  • MySQL 中使用数据库名称通配符授予权限?

    我想创建一个用户 projectA 该用户对名为 projectA 的每个数据库具有相同的权限 我知道这是可能的 但 MySQL 不喜欢我的语法 grant all on projectA to projectA 参考 http dev m
  • 如何将 JavascriptSerializer 序列化的 DateTime 字符串转换为 Javascript Date 对象

    序列化对象后DateTime场与JavaScriptSerializer 我看到DateTime字段看起来像这样 EffectiveFrom Date 1355496152000 如何将此字符串转换为 Javascript Date 对象
  • Gradle 构建和部署特定的构建类型

    我想使用特定的构建类型构建我的 gradle 项目 并使用单个命令将其部署到设备上 我的 build gradle 设置为多种构建类型 例如实时和发布 我之前与 Maven 合作过 我寻找相当于 mvn clean install P re
  • Regex.Escape 的目的是什么?

    我有如下代码 其中 QualifiedInstanceFilter 是合格实例过滤器的访问器 谁能告诉我 m afc QualifiedInstanceFilter Regex Escape this Identifier 行中发生的逻辑是
  • 更改字体大小而不弄乱 Tkinter 按钮大小

    我遇到麻烦了更改按钮的字体大小在 Tkinter 中 当我尝试这样做时该按钮还可以展开 收缩基于文本的大小 有没有办法可以通过固定按钮的大小来改变文本大小 我在设计 tic tac toe 应用程序时遇到了这个问题 但是为了省去你的麻烦 这
  • 如何在 IE8 中转储 JavaScript 变量?

    我有一个需要在 IE8 中检查的对象 我尝试了开发者工具console log 他们的 Firebug 等价物 但是 当我将对象输出到日志时 console log Element element console log element 我
  • 如何在 SQL Server 中拆分分隔字符串而不创建函数?

    我正在使用 SQL Server 数据库 我有一列包含分隔列表 我需要编写一个查询 将列表的值拆分为行 通过浏览 StackOverflow 和网络的其他部分 我知道这是一个常见问题 事实上 我在这里找到了广泛的分析 http www so
  • ILGenerator 是否有一个好的包装器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过pdb调试djcelery的celeryd

    有人尝试过使用 pdb 调试 celeryd 工作程序吗 每当遇到断点 通过 pdb 运行 celeryd 或者通过pdb set trace 我遇到了以下错误 Error while handling action event Trace
  • 间歇性地从 LinkedIn API 收到 999 请求被拒绝。原因代码1,2,1指的是什么

    在过去的两天里 两个不同的 LinkedIn 应用程序 开始间歇性地收到 999 请求被拒绝的错误 除此之外 我收到 reason code 1 2 1 作为标题 具体来说 这是从 oAuth 过程的第三步 与https www linke
  • R randomForest子集无法摆脱因子水平[重复]

    这个问题在这里已经有答案了 可能的重复 删除 R 中子集数据框中的因子级别 https stackoverflow com questions 1195826 dropping factor levels in a subsetted da
  • 计算 Google Sheets 脚本中的粗体单元格数量

    所以 说实话 我并不是一个编码员 但我已经设法通过计算单元格背景颜色来摸索 但努力让它适用于计算字体为粗体的单元格 我在下面详细介绍了我的函数 其中仅计算了 6 个具有粗体字体样式的单元格 但有 13 个具有粗体字体样式的单元格 funct
  • 相对时间序列

    我正在寻找一种标准化的方法来按相对时间排列数据 应用程序包括会计数据 例如 FY1 FY2 等 和经济数据 例如使用 1 年 2 年 3 年等的利率期限结构 我希望能够比较当前的一组时间序列数据和代表类似情况或历史规范的几个历史时间序列集
  • 立即处理至 App Store 后下架

    我的应用程序之前已下架 更新获得批准后 我在 10 分钟内收到了 3 封有关状态的电子邮件 1 处理至App Store 2 准备出售 3 停止销售 在 准备销售 状态之后 状态立即更改为 已从销售中删除 我联系了苹果公司 她说一旦应用程序
  • JavaScript XMLHttpRequest“网络错误”

    一般来说 我在 javascript 和 Web 开发方面缺乏经验 我正在从事的项目是一般公司培训计划的一部分 我们被指示使用 Google Chrome 作为主要测试浏览器 本质上 我正在编写一个将在公司内部网外部的客户端上运行的应用程序
  • 使用 Spark Web 框架时如何使用原生 Servlet Filter?

    我正在玩Spark http sparkjava com Java Web 框架 而不是 Apache Spark 我发现定义路由和过滤器非常好且容易 但是我希望将本机 servlet 过滤器应用于我的路由 但似乎找不到方法来做到这一点 更