2015-05-01 2 views
0

Я не могу найти примеры встроенного причала с моей комбинацией обработчиков и фильтров. По какой-то причине я не могу определить, что я не получаю заголовки CORS. Вот мой текущий источник:встроенный причал CrossDomainFilter не работает

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

С таким же результатом, я никогда не видел заголовков Междоменных. Что еще мне нужно сделать, чтобы этот фильтр работал?

ответ

1

Не используйте непосредственно ServletHandler, это внутренний класс. Фильтры всегда являются частью ServletContextHandler (или более специализированных WebAppContext)

Ваша конфигурация не добавляет 2 сервлеты в /* контекста (что нет-нет)

Ваша конфигурация добавляет ваш RequestLogHandler после DefaultHandler (который означает, что RequestLogHandler никогда не работает)

DefaultHandler должно быть в конце основного списка обработчиков

DefaultServlet урожденной DS существовать в вашем ServletContextHandler

Вы отсутствуете необходимый resourceBase для вашего ServletContextHandler (это путь или URL, указывающий на правильное местоположение, чтобы сделать ServletContext здравомыслящими для нахождения ресурсов)

Пути спецификацией из * является инвалид. (Помните, что вы можете использовать префикс /a/b/*, суффикс *.foo, точный /a/b/c, или по умолчанию /)

Таким образом, чтобы упростить ...

package org.eclipse.jetty.demo; 

import java.util.EnumSet; 

import javax.servlet.DispatcherType; 

import org.eclipse.jetty.server.AsyncNCSARequestLog; 
import org.eclipse.jetty.server.Handler; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.handler.DefaultHandler; 
import org.eclipse.jetty.server.handler.HandlerList; 
import org.eclipse.jetty.server.handler.RequestLogHandler; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.FilterHolder; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 
import org.eclipse.jetty.servlets.CrossOriginFilter; 
import org.glassfish.jersey.server.ServerProperties; 
import org.glassfish.jersey.servlet.ServletContainer; 

public class JerseyWithCors 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      new JerseyWithCors().exec(); 
     } 
     catch (Throwable t) 
     { 
      t.printStackTrace(System.err); 
     } 
    } 

    public void exec() throws Exception 
    { 
     int port = 8080; 
     Server server = new Server(port); 
     HandlerList handlers = new HandlerList(); 
     server.setHandler(handlers); 

     handlers.addHandler(getAccessLogHandler()); 
     handlers.addHandler(getMainServletContext()); 

     // DefaultHandler is always last for the main handler tree 
     // It's responsible for Error handling of all prior handlers. 
     // It will always respond (if the request reaches this far) 
     handlers.addHandler(new DefaultHandler()); 

     server.start(); 
     server.join(); 
    } 

    public Handler getAccessLogHandler() 
    { 
     RequestLogHandler logHandler = new RequestLogHandler(); 
     AsyncNCSARequestLog log = new AsyncNCSARequestLog(); 
     log.setFilename("logs/access-yyyy_mm_dd.log"); 
     logHandler.setRequestLog(log); 
     return logHandler; 
    } 

    public Handler getMainServletContext() 
    { 
     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setContextPath("/"); 
     // always need a resource base 
     context.setResourceBase("path/to/webroot"); 

     ServletHolder jerseyServlet = context.addServlet(ServletContainer.class,"/*"); 
     jerseyServlet.setInitOrder(0); 
     jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES,"org.example.pss.resources"); 

     FilterHolder filterHolder = context.addFilter(CrossOriginFilter.class,"/*",EnumSet.allOf(DispatcherType.class)); 
     filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,"*"); 
     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"); 
     filterHolder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM,"true"); 

     // DefaultServlet is always last for a ServletContext 
     context.addServlet(DefaultServlet.class,"/"); 

     return context; 
    } 
} 
+0

Спасибо Иоаким. Пример подобным образом улучшит документацию для Jetty, встроенная настройка не так хорошо покрывается, как операция webapp и статические файлы конфигурации. – user3442828

+0

Я все еще не получаю заголовок CORS? Я добавил: filterHolder.setInitParameter (CrossOriginFilter.EXPOSED_HEADERS_PARAM, («Access-Control-Allow-Origin»)); и до сих пор не понял. Таким образом, поддержка перекрестных доменов далеко. Как мне это получить? I GET с заголовком: Ведущий: pss.hcl.com:8088 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; с.в.: 37,0) Gecko/20100101 Firefox/37,0 Accept: текст/html, application/xhtml + xml, application/xml; q = 0,9, */*; q = 0,8 Accept-язык: en-US, en; q = 0,5 Accept-Encoding: gzip, deflate Получить: – user3442828

Смежные вопросы