【问题标题】:Jetty adding web fragment to web context programmaticallyJetty 以编程方式将 Web 片段添加到 Web 上下文
【发布时间】:2015-05-26 08:20:09
【问题描述】:

我已经开始使用嵌入式 Jetty Server 来启动一些 3rd-party WAR。 所以我使用 WebAppContext:

Server server = new Server(port);
WebAppContext ctx = new WebAppContext();
ctx.setContextPath("/samplePath");
ctx.setWar(<PATH_TO_WAR>);
server.setHandler(ctx);
server.start();
server.join();

这段代码有效(为了简洁起见,我省略了异常处理),但是现在我想在战争中添加一些我想保持不变的功能(我的意思是,不要提取更改和压缩再次)。 我的功能应包括与一些自定义 SSO 解决方案的集成,该解决方案应添加以下内容:

  • 上下文监听器
  • 过滤器
  • 这些过滤器和侦听器应读取的一些上下文参数变量定义

我无法更改此 SSO 解决方案,因为它不是我们团队开发的,我们宁愿将其视为第三方。

所以我认为将所有这些添加到带有 web-fragment 的模块中将是最好的方法。

我的问题是:让 Jetty 的网络上下文“了解”这个网络片段的最佳方法是什么?一个工作代码 sn-p 会很棒:)

当然,如果有比网络片段更好的替代方案,我会很高兴知道

我目前使用的 Jetty 版本是(来自我的 pom.xml):9.2.10.v20150310

提前非常感谢!

【问题讨论】:

  • 一个简单的问题,你有一个正在运行的网络应用程序,你需要在不影响战争文件的情况下再包含几个servlet-class 对吗?
  • 是的,完全正确。我不想只添加 servlet。我需要添加过滤器、上下文监听器和上下文路径变量。

标签: java servlets web jetty web-fragment


【解决方案1】:

您可以通过以下方式指定 Web 应用程序和过滤器

import java.io.IOException;
import java.util.EnumSet;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.webapp.WebAppContext;

public class MultipleHandler {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Server server = new Server();
        ServerConnector connectorA = new ServerConnector(server);
        connectorA.setPort(55);
        connectorA.setName("connA"); // connector name A
        server.addConnector(connectorA);
        HandlerCollection contexts = new HandlerCollection();
        server.setHandler(contexts);
        // A WebApp
        WebAppContext appA = new WebAppContext();
        appA.setContextPath("/samplePath");
        appA.setWar("<warFilePath>");
        appA.setVirtualHosts(new String[] { "@connA" }); // connector name A
        contexts.addHandler(appA);

        //Filter handler
        ServletHandler handler = new ServletHandler();
        handler.addFilterWithMapping(DoWork.class, "/filter",
                EnumSet.of(DispatcherType.REQUEST));
        contexts.addHandler(handler);       

        try {
            server.start(); 
            server.join(); 
        } catch (Throwable t) {
            t.printStackTrace(System.err);
        }

    }


    public static class DoWork implements Filter {

        @Override
        public void destroy() {
            // TODO Auto-generated method stub

        }

        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
             System.out.print("Request filtered");

        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub

        }

    }

}

【讨论】:

  • 对不起,但这对我没有帮助。过滤器不是问题,因为它可以通过调用 addFilter 到 WebAppContext 来正确设置。与此不同的是,我找不到添加 ContextFilter 和 Context Parameter 变量的方法。因此问题。不能接受这个作为答案,对不起
  • 是的。如果你没看到,stackoverflow.com/questions/19530806/…
  • 谢谢,是的,我还没有看到这个,但是 Jetty 的 API 使用 java.util.EventListener,它没有实现 javax.servlet.ServletContextListener,所以我无法从方法访问 servlet 上下文那个听众。我正在寻找允许我将 web 片段 jar 放在文件系统中的某个文件夹中的解决方案,并且码头将使用与加载战争本身相同的类加载器加载它。
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2018-05-10
相关资源
最近更新 更多