带有 Jersey 和嵌入式 Jetty 的 CrossOriginFilter
CrossOriginFilter with Jersey and embedded Jetty
我知道 this question and that on 但是他们在 4 年前没有得到回答和询问。此外,没有一个答案对我有用。
我无法将 crossOriginFilter 添加到我的嵌入式码头服务器。
我的pom
<!-- Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
我的代码 - 不幸的是我在响应中没有得到任何 Header 字段!
ServletContextHandler dynamicResourceContext = new ServletContextHandler();
dynamicResourceContext.setContextPath("/rest");
FilterHolder holder = new FilterHolder(CrossOriginFilter.class);
holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");
dynamicResourceContext.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
ServletContextHandler staticResourceContext = new ServletContextHandler();
staticResourceContext.setContextPath("/resources");
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/webapp/");
staticResourceContext.addServlet(holderPwd, "/*");
HandlerList handlers = new HandlerList();
handlers.addHandler(dynamicResourceContext);
handlers.addHandler(staticResourceContext);
server = new Server(port);
server.setHandler(handlers);
// set logging to console
StdErrLog logger = new StdErrLog();
logger.setDebugEnabled(webserverLogging);
Log.setLog(logger);
ServletHolder jerseyServlet = dynamicResourceContext
.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
// Tells the Jersey Servlet which REST service/class to load.
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", getMyClasses());
try {
server.start();
} catch (Exception e) {
e.printStackTrace();
} finally {
// server.destroy();
}
我做错了什么?我没有收到任何错误消息!
编辑
下面的 tutorial 也不起作用。无论是使用 Postman 还是使用 chrome,我都看到一个额外的响应头条目。
响应如下所示:
HTTP/1.1 200 OK
Date: Tue, 26 Mar 2019 19:41:36 GMT
Content-Length: 0
Server: Jetty(9.4.15.v20190215)
编辑
我能够使用资源配置创建 header 字段,但我仍然无法使用 CrossOriginFilter 创建它们。
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
Server jettyServer = new Server(9998);
jettyServer.setHandler(context);
ResourceConfig webapiResourceConfig = new ResourceConfig();
webapiResourceConfig.register(CorsFilter.class);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(webapiResourceConfig));
context.addServlet(jerseyServlet, "/*");
//context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",MyServerConfig.class.getCanonicalName());
您不应在 Postman 中看到 header,因为 Postman 不需要 CORS 支持。在 Chrome(或任何浏览器)中,只有当您实际发出跨源请求时,您才应该看到它们。如果过滤器实施正确,它应该只在有 Origin 请求 header 时吐出 CORS 响应 headers。这应该只发生在浏览器发出的跨源请求上。
根据 CORS 协议,您的 Jersey 过滤器之所以起作用,可能是因为它没有正确实现;它可能只是一个惰性版本,其中为所有请求添加了 headers。在 this answer 中,我最初也实现了相同的 "lazy" CORS 支持,但如果您查看 UPDATE,我会解释应该如何实现。如果您想了解有关 CORS 的更多信息,那本 UPDATE 是一本不错的读物。
我知道 this question and that on 但是他们在 4 年前没有得到回答和询问。此外,没有一个答案对我有用。 我无法将 crossOriginFilter 添加到我的嵌入式码头服务器。
我的pom
<!-- Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>9.2.11.v20150529</version>
</dependency>
我的代码 - 不幸的是我在响应中没有得到任何 Header 字段!
ServletContextHandler dynamicResourceContext = new ServletContextHandler();
dynamicResourceContext.setContextPath("/rest");
FilterHolder holder = new FilterHolder(CrossOriginFilter.class);
holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
holder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");
dynamicResourceContext.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
ServletContextHandler staticResourceContext = new ServletContextHandler();
staticResourceContext.setContextPath("/resources");
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/webapp/");
staticResourceContext.addServlet(holderPwd, "/*");
HandlerList handlers = new HandlerList();
handlers.addHandler(dynamicResourceContext);
handlers.addHandler(staticResourceContext);
server = new Server(port);
server.setHandler(handlers);
// set logging to console
StdErrLog logger = new StdErrLog();
logger.setDebugEnabled(webserverLogging);
Log.setLog(logger);
ServletHolder jerseyServlet = dynamicResourceContext
.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
// Tells the Jersey Servlet which REST service/class to load.
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", getMyClasses());
try {
server.start();
} catch (Exception e) {
e.printStackTrace();
} finally {
// server.destroy();
}
我做错了什么?我没有收到任何错误消息!
编辑
下面的 tutorial 也不起作用。无论是使用 Postman 还是使用 chrome,我都看到一个额外的响应头条目。 响应如下所示:
HTTP/1.1 200 OK
Date: Tue, 26 Mar 2019 19:41:36 GMT
Content-Length: 0
Server: Jetty(9.4.15.v20190215)
编辑 我能够使用资源配置创建 header 字段,但我仍然无法使用 CrossOriginFilter 创建它们。
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
Server jettyServer = new Server(9998);
jettyServer.setHandler(context);
ResourceConfig webapiResourceConfig = new ResourceConfig();
webapiResourceConfig.register(CorsFilter.class);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(webapiResourceConfig));
context.addServlet(jerseyServlet, "/*");
//context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",MyServerConfig.class.getCanonicalName());
您不应在 Postman 中看到 header,因为 Postman 不需要 CORS 支持。在 Chrome(或任何浏览器)中,只有当您实际发出跨源请求时,您才应该看到它们。如果过滤器实施正确,它应该只在有 Origin 请求 header 时吐出 CORS 响应 headers。这应该只发生在浏览器发出的跨源请求上。
根据 CORS 协议,您的 Jersey 过滤器之所以起作用,可能是因为它没有正确实现;它可能只是一个惰性版本,其中为所有请求添加了 headers。在 this answer 中,我最初也实现了相同的 "lazy" CORS 支持,但如果您查看 UPDATE,我会解释应该如何实现。如果您想了解有关 CORS 的更多信息,那本 UPDATE 是一本不错的读物。