如何在几个ServletContextHandler之间共享单个Filter实例

时间:2018-11-15 13:51:22

标签: java servlets servlet-filters embedded-jetty

在我的代码中,我使用的是来自第3方jar的过滤器类,该类可以实例化一次。 当我创建嵌入式码头服务器实例时,我有几个ServletContextHandler,并且为其中每个添加了过滤器。 有没有一种方法可以在2个或更多上下文处理程序之间共享实例过滤器?

请参见下面的代码:

public static void main (String[] args) {
        try {
            Server jettyServer = new Server(8080);

            final HandlerList handlers = new HandlerList();

            ServletContextHandler restCtx = initRestCtx();

            ServletContextHandler wsCtx = initWsCtx();

            handlers.setHandlers(new Handler[]{
                    restCtx,
                    wsCtx,
                    new DefaultHandler()});

            jettyServer.setHandler(handlers);
            jettyServer.start();
        } catch (Exception e) {
            log.error(String.format("An issue occur when starting server: %s",e.getMessage()));
        }
    }

    private static ServletContextHandler initWsCtx() {
        ServletContextHandler wsCtx = createSessionBasedContextHandler();
        wsCtx.setContextPath("/ws");
        wsCtx.addFilter(new MyFilter(), "/*", EnumSet.of(DispatcherType.REQUEST));
        return wsCtx;
    }

    private static ServletContextHandler initRestCtx() {
        ServletContextHandler restCtx = createSessionBasedContextHandler();
        restCtx.setContextPath("/rest");
        restCtx.addFilter(new MyFilter(), "/*", EnumSet.of(DispatcherType.REQUEST));
        return restCtx;
    }

    private static ServletContextHandler createSessionBasedContextHandler() {
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler
                .getSessionHandler()
                .setMaxInactiveInterval(30);

        return servletContextHandler;
    }

我在这里简化了代码,因此我必须具有2个不同的上下文,并且不能使其成为一个上下文。

0 个答案:

没有答案