Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jetty 带嵌入式码头的交叉原点过滤器_Jetty - Fatal编程技术网

Jetty 带嵌入式码头的交叉原点过滤器

Jetty 带嵌入式码头的交叉原点过滤器,jetty,Jetty,我正在尝试让CrossOriginFilter与两个嵌入式Jetty服务器一起工作,这两个服务器都运行在我们的内部网络上。两者都在运行servlet,但我需要服务器A的网页才能发布到服务器B的servlet。我认为我需要将ACCESS\u CONTROL\u ALLOW\u ORIGIN添加到CrossOriginFilter中,但要找到如何在没有web.xml的嵌入式Jetty实例中实现这一点并不容易。尝试访问服务器b的服务器时,我在浏览器中收到以下错误消息 No 'Access-Contro

我正在尝试让CrossOriginFilter与两个嵌入式Jetty服务器一起工作,这两个服务器都运行在我们的内部网络上。两者都在运行servlet,但我需要服务器A的网页才能发布到服务器B的servlet。我认为我需要将ACCESS\u CONTROL\u ALLOW\u ORIGIN添加到CrossOriginFilter中,但要找到如何在没有web.xml的嵌入式Jetty实例中实现这一点并不容易。尝试访问服务器b的服务器时,我在浏览器中收到以下错误消息

No 'Access-Control-Allow-Origin' header is present on the requested resource
我使用angularjs在控制器中发布到其他服务器的servlet

下面是其中一台服务器的代码(两者几乎相同)


通过这样做使它工作起来

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");
holder.setName("cross-origin");
FilterMapping fm = new FilterMapping();
fm.setFilterName("cross-origin");
fm.setPathSpec("*");
handler.addFilter(holder, fm );
有几点:

  • 不要那样赤裸裸地使用
    ServletHandler
    ServletHandler
    ServletContextHandler
    使用的内部类
  • ServletContextHandler
    为您正在使用的各种servlet和过滤器提供所需的
    ServletContext
    对象和状态
  • ServletContextHandler
    还为整个上下文路径声明提供了一个位置
  • ServletContextHandler
    也是欢迎文件声明的地方
  • 不要使用
    ResourceHandler
    ,当您有可用的
    DefaultServlet
    时,它的功能更强大,功能更丰富
例如:

response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Methods", "POST, GET");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
Server服务器=新服务器(httpPort);
//设置servlet的上下文
ServletContextHandler上下文=新的ServletContextHandler();
//为所有筛选器和servlet设置上下文
//内部servlet和筛选器ServletContext正常所需
context.setContextPath(“/”);
//servlet上下文保存欢迎列表
//(不是ResourceHandler或DefaultServlet)
setWelcomeFiles(新字符串[]{“index.html”});
//添加一个servlet
addServlet(ServerPageRoot.class,“/servlet/*”);
//添加筛选器,然后使用提供的FilterHolder对其进行配置
FilterHolder cors=context.addFilter(CrossOriginFilter.class,“/*”,EnumSet.of(DispatcherType.REQUEST));
cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,“*”);
cors.setInitParameter(CrossOriginFilter.ACCESS\u CONTROL\u ALLOW\u ORIGIN\u HEADER,“*”);
cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,“GET,POST,HEAD”);
cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,“X-request-With,Content-Type,Accept,Origin”);
//使用DefaultServlet为静态文件提供服务。
//备用支架技术,准备然后添加。
//DefaultServlet应命名为“default”
ServletHolder def=newservletholder(“default”,DefaultServlet.class);
def.setInitParameter(“resourceBase”、“/http/”;
def.setInitParameter(“dirAllowed”、“false”);
addServlet(def,“/”);
//创建服务器级处理程序列表。
HandlerList handlers=new HandlerList();
//确保DefaultHandler是最后一个(出于错误处理原因)
setHandlers(新处理程序[]{context,新的DefaultHandler()});
setHandler(处理程序);
server.start();

我尝试了上述答案和其他类似的答案。但我总是遇到同样的错误信息

最后,我为自己的处境找到了一个正确的答案。我将Jersey与Jetty一起使用,而不是使用web.xml。如果您尝试了所有方法,但没有启用CORS支持,那么您可以尝试下面的解决方案

  • 首先,定义一个过滤器(您可以定义另一个直接实现过滤器类的过滤器)

  • 将此筛选器注册到资源配置


  • 就这样。这个解决方案解决了我的问题。也许它对其他人有用。

    也许这会对某些人有所帮助,即使这不是对原始问题的一个好答案。我意识到,通过直接在处理程序中操作头,可以轻松地在嵌入式jetty实例中启用跨源请求共享。下面的response对象是HttpServletResponse的实例(传递给处理程序)

    例如:

    response.addHeader("Access-Control-Allow-Origin", "*");
    response.addHeader("Access-Control-Allow-Credentials", "true");
    response.addHeader("Access-Control-Allow-Methods", "POST, GET");
    response.addHeader("Access-Control-Allow-Headers", "Content-Type");
    

    你介意更新你的答案吗?因为提供的代码不起作用(v9.3.4RC0)。Firefox告诉我,
    CORS header'Access Control Allow Origin'missing
    @joakim erdfelt我有一个元问题:如何找到这个解决方案(当然除了找到你的好答案之外)?通过阅读Jetty和Servlet文档,我真的很努力地了解自己,但没有成功。你能告诉我正确的方向吗?你能发布完整的代码吗(包括启动码头?)
    import java.io.IOException;
    
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.ServerConnector;
    import org.eclipse.jetty.servlet.DefaultServlet;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.glassfish.jersey.server.ResourceConfig;
    import org.glassfish.jersey.servlet.ServletContainer;
    
    public class AppServer {
    
        public static void main(String[] args) throws Exception {
    
            Server jettyServer = new Server();
    
            // Add port
            ServerConnector jettyServerConnector = new ServerConnector(jettyServer);
            jettyServerConnector.setPort(Integer.parseInt("9090"));
            jettyServer.addConnector(jettyServerConnector);
    
            // Define main servlet context handler
            ServletContextHandler jettyServletContextHandler = new ServletContextHandler();
            jettyServletContextHandler.setContextPath("/service");
    
            // Define main resource (webapi package) support
            ResourceConfig webapiResourceConfig = new ResourceConfig();
            webapiResourceConfig.packages("com.example.service");
            ServletContainer webapiServletContainer = new ServletContainer(webapiResourceConfig);
            ServletHolder webapiServletHolder = new ServletHolder(webapiServletContainer);
            jettyServletContextHandler.addServlet(webapiServletHolder, "/webapi/*");
    
            // Add Cors Filter
            webapiResourceConfig.register(CorsFilter.class, 1);
    
            try {
                jettyServer.start();
                jettyServer.dump(System.err);
                jettyServer.join();
            } catch (Throwable t) {
                t.printStackTrace(System.err);
            } finally {
                jettyServer.destroy();
            }
        }
    }
    
    response.addHeader("Access-Control-Allow-Origin", "*");
    response.addHeader("Access-Control-Allow-Credentials", "true");
    response.addHeader("Access-Control-Allow-Methods", "POST, GET");
    response.addHeader("Access-Control-Allow-Headers", "Content-Type");