Java 嵌入式jetty CrossDomainFilter不工作

Java 嵌入式jetty CrossDomainFilter不工作,java,jetty,cors,embedded-jetty,Java,Jetty,Cors,Embedded Jetty,我找不到结合了处理程序和过滤器的嵌入式jetty示例。由于某些原因,我无法确定我没有得到CORS标题。以下是我目前的资料来源: private static Server setupJetty(Properties prop) { Server server = new Server(Integer.parseInt(prop.getProperty("port"))); ServletContextHandler context = new ServletContextHand

我找不到结合了处理程序和过滤器的嵌入式jetty示例。由于某些原因,我无法确定我没有得到CORS标题。以下是我目前的资料来源:

private static Server setupJetty(Properties prop) {
    Server server = new Server(Integer.parseInt(prop.getProperty("port")));
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath(prop.getProperty("contextpath"));
    ContextHandlerCollection contexts = new ContextHandlerCollection();
    RequestLogHandler requestLogHandler= setupLogging(server, prop.getProperty("logslocn"));
    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tells the Jersey Servlet which REST service/class to load.
    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "org.example.pss.resources");
    context.addServlet(jerseyServlet, prop.getProperty("servletpath"));

    ServletHandler handler = new ServletHandler();
    handler.addServletWithMapping(jerseyServlet, "/*");

    FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");    // allowed origins comma separated
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS");
    filterHolder.setInitParameter(CrossOriginFilter.PREFLIGHT_MAX_AGE_PARAM, "5184000"); // 2 months
    filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");
    filterHolder.setName("cross-origin");
    FilterMapping fm = new FilterMapping();
    fm.setFilterName("cross-origin");
    fm.setPathSpec("*");       
    handler.addFilter(filterHolder,fm);

    HandlerCollection handlers = new HandlerCollection();
    handlers.setHandlers(new Handler[]{context, handler, contexts, 
            new DefaultHandler(), requestLogHandler});
    server.setHandler(handlers);
    return server;
}
我还尝试:

    FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter());
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "/*");    // allowed origins comma separated
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
    filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS");
    filterHolder.setInitParameter(CrossOriginFilter.PREFLIGHT_MAX_AGE_PARAM, "5184000"); // 2 months
    filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");
    context.addFilter(filterHolder,"/*",EnumSet.allOf(DispatcherType.class));

    HandlerCollection handlers = new HandlerCollection();
    handlers.setHandlers(new Handler[]{context, contexts, 
            new DefaultHandler(), requestLogHandler});
    server.setHandler(handlers);

同样的结果是,我从未看到跨域头。我还需要做什么才能让这个过滤器工作?

不要直接使用
ServletHandler
,这是一个内部类。 过滤器始终是
ServletContextHandler
(或更专业的
WebAppContext
)的一部分

您的配置在
/*
上下文路径中添加了2个servlet(这是一个否)

您的配置将
RequestLogHandler
添加到
DefaultHandler
之后(这意味着
RequestLogHandler
永远不会运行)

DefaultHandler
应位于主处理程序列表的末尾

DefaultServlet
需要存在于
ServletContextHandler

您缺少
ServletContextHandler
所需的
resourceBase
(这是指向有效位置的路径或URL,使
ServletContext
能够正常查找资源)

*
的路径规范无效。(请记住,您可以使用前缀
/a/b/*
、后缀
*.foo
、精确
/a/b/c
、或默认值
/

所以,为了简化

package org.eclipse.jetty.demo;
导入java.util.EnumSet;
导入javax.servlet.DispatcherType;
导入org.eclipse.jetty.server.AsyncNCSARequestLog;
导入org.eclipse.jetty.server.Handler;
导入org.eclipse.jetty.server.server;
导入org.eclipse.jetty.server.handler.DefaultHandler;
导入org.eclipse.jetty.server.handler.HandlerList;
导入org.eclipse.jetty.server.handler.RequestLogHandler;
导入org.eclipse.jetty.servlet.DefaultServlet;
导入org.eclipse.jetty.servlet.FilterHolder;
导入org.eclipse.jetty.servlet.ServletContextHandler;
导入org.eclipse.jetty.servlet.ServletHolder;
导入org.eclipse.jetty.servlets.CrossOriginFilter;
导入org.glassfish.jersey.server.ServerProperties;
导入org.glassfish.jersey.servlet.ServletContainer;
公营运动衫
{
公共静态void main(字符串[]args)
{
尝试
{
新球衣WithCors().exec();
}
捕获(可丢弃的t)
{
t、 printStackTrace(System.err);
}
}
public void exec()引发异常
{
int端口=8080;
服务器=新服务器(端口);
HandlerList handlers=new HandlerList();
setHandler(处理程序);
addHandler(getAccessLogHandler());
addHandler(getMainServletContext());
//DefaultHandler始终是主处理程序树的最后一个
//它负责所有先前处理程序的错误处理。
//它将始终作出响应(如果请求达到此程度)
addHandler(新的DefaultHandler());
server.start();
join();
}
公共处理程序getAccessLogHandler()
{
RequestLogHandler logHandler=新的RequestLogHandler();
AsyncNCsRequestLog=新的AsyncNCsRequestLog();
log.setFilename(“logs/access-yyyy_mm_dd.log”);
setRequestLog(日志);
返回日志处理程序;
}
公共处理程序getMainServletContext()
{
ServletContextHandler上下文=新的ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
//总是需要一个资源库
setResourceBase(“path/to/webroot”);
ServletHolder jerseyServlet=context.addServlet(ServletContainer.class,“/*”);
jerseyServlet.setInitOrder(0);
setInitParameter(ServerProperties.PROVIDER_包,“org.example.pss.resources”);
FilterHolder FilterHolder=context.addFilter(CrossOriginFilter.class,“/*”,EnumSet.allOf(DispatcherType.class));
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,“*”);
filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_Header_PARAM,“内容类型、授权、X-Requested-With、内容长度、接受、来源”);
setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,“GET、PUT、POST、DELETE、OPTIONS”);
filterHolder.setInitParameter(CrossOriginFilter.PREFLIGHT_MAX_AGE_PARAM,“5184000”);
filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM,“true”);
//对于ServletContext,DefaultServlet始终是最后一个
addServlet(DefaultServlet.class,“/”);
返回上下文;
}
}

谢谢你,Joakim。像这样的一个例子可以增强Jetty的文档,嵌入式安装没有webapp操作和静态配置文件涵盖的那么多?我添加了:filterHolder.setInitParameter(CrossOriginFilter.EXPOSED_HEADERS_PARAM,(“访问控制允许原点”);但还是不明白。因此,目前还没有跨域支持。我怎么得到这个?我得到的标题是:主机:pss.hcl.com:8088用户代理:Mozilla/5.0(WindowsNT6.3;WOW64;rv:37.0)Gecko/20100101 Firefox/37.0接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8接受语言:en-US,en;q=0.5接受编码:gzip,泄气获取: