CrossOriginFilter с Джерси и встроенной пристанью - PullRequest
1 голос
/ 26 марта 2019

Я знаю этот вопрос и , что на однако они не получили ответа и спросили 4 года назад.Далее, ни один из ответов не работал для меня.Я не могу добавить crossOriginFilter к моему встроенному серверу Jetty.

Мой 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> 

Мой код - к сожалению, я не получаю никакого поля заголовка в ответах!

        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();
        }    

Что я не прав?Я не получаю никакого сообщения об ошибке!

РЕДАКТИРОВАТЬ

Также не работает следующий учебник .Ни с почтальоном, ни с хромом я не вижу дополнительной записи заголовка ответа.Ответ выглядит следующим образом:

HTTP/1.1 200 OK
Date: Tue, 26 Mar 2019 19:41:36 GMT
Content-Length: 0
Server: Jetty(9.4.15.v20190215)

EDIT Мне удалось создать поля заголовков с помощью конфигурации ресурсов, но я все еще не могу создать их с помощью 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());

1 Ответ

1 голос
/ 27 марта 2019

Вы не должны видеть заголовки в Postman, поскольку Postman не требует поддержки CORS. А в Chrome (или любом другом браузере) вы должны видеть их только в том случае, если вы действительно отправляете запрос из разных источников. Если фильтр реализован правильно, он должен выплевывать заголовки ответов CORS только при наличии заголовка запроса источника. И это должно происходить только в случае перекрестных запросов, исходящих из браузера.

Причина, по которой ваш фильтр на Джерси работал, возможно, в том, что он не реализован правильно, согласно протоколу CORS; это, вероятно, просто ленивая версия, где заголовки добавляются для всех запросов. В этом ответе я первоначально также реализовал ту же самую "ленивую" поддержку CORS, но если вы посмотрите на ОБНОВЛЕНИЕ, я объясню, как это должно быть реализовано. Если вы хотите узнать больше о CORS, то ОБНОВЛЕНИЕ - хорошее чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...