0

我已经开始使用嵌入式 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 的 web 上下文“意识到”这个 web 片段的最佳方法是什么?一个工作代码片段会很棒:)

当然,如果有比网络片段更好的选择,我会很高兴知道

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

提前非常感谢!

4

1 回答 1

0

这是您可以指定 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

        }

    }

}
于 2015-05-26T10:20:17.243 回答