2015-09-17 22 views
5

Spark (Java web çerçevesi, Apache Spark değil) ile oynuyorum.Spark web framework'ü kullanırken yerel bir Servlet Filtresi nasıl kullanılabilir?

Yolları ve filtreleri tanımlamayı gerçekten çok güzel ve kolay buluyorum, ancak rotalarıma yerel bir sunucu filtresi uygulamak istiyorum ve bunu yapmanın bir yolunu bulamıyorum.

Daha spesifik olarak, bir servlet filtresi olan (Spark Filtresi tanımının tersi) Jetty's DoSFilter kullanmak istiyorum. Spark, gömülü İskelesi kullandığı için DoSFilter'ı kaydetmem için bir web.xml kullanmam. Ancak, Spark sunucu örneğini ortaya çıkarmaz, bu nedenle filtreyi programlı olarak kaydetmenin zarif bir yolunu bulamıyorum.

Rotalarıma yerel bir sunucu filtresi uygulamak için bir yol var mı?

DoSFilter'ı kendi Spark Filtresimde sarmalamayı düşündüm, ama garip bir fikir gibi görünüyordu.

+0

hey sen kıvılcımla servlet filtreleri kullanmak için bir yol buldunuz? ya da en azından iskelet sunucusunu nasıl başlatmalı ve kıvılcım servlet olarak nasıl ekleyecek? – jfplataroti

+0

Ona baktığımdan beri bir süredir var, ama kıvılcım ile şakayı çalıştırmak yerine kontrolü ve web uygulaması içine kıvılcım yerleştirmenin bir yolu var - http://sparkjava.com/documentation.html#other-webserver. Kaynak kodunu incelediğimi hatırlıyorum ve kurulumu oldukça basit görünüyordu. Umarım yardımcı olur. – elanh

+0

Bu muhtemelen bir https://stackoverflow.com/questions/14390577/how-to-add-servlet-filter-with-embedded-jetty kopyasıdır? –

cevap

0

Böyle yapabilirsiniz:

public class App { 
private static Logger LOG = LoggerFactory.getLogger(App.class); 

public static void main(String[] args) throws Exception { 

    ServletContextHandler mainHandler = new ServletContextHandler(); 
    mainHandler.setContextPath("/base/path"); 

    Stream.of(
      new FilterHolder(new MyServletFilter()), 
      new FilterHolder(new SparkFilter()) {{ 
       this.setInitParameter("applicationClass", SparkApp.class.getName()); 
      }} 
    ).forEach(h -> mainHandler.addFilter(h, "*", null)); 

    GzipHandler compression = new GzipHandler(); 
    compression.setIncludedMethods("GET"); 
    compression.setMinGzipSize(512); 
    compression.setHandler(mainHandler); 

    Server server = new Server(new ExecutorThreadPool(new ThreadPoolExecutor(10,200,60000,TimeUnit.MILLISECONDS, 
                      new ArrayBlockingQueue<>(200), 
                     new CustomizableThreadFactory("jetty-pool-")))); 

    final ServerConnector serverConnector = new ServerConnector(server); 
    serverConnector.setPort(9290); 
    server.setConnectors(new Connector[] { serverConnector }); 

    server.setHandler(compression); 
    server.start(); 

    hookToShutdownEvents(server); 

    server.join(); 
} 

private static void hookToShutdownEvents(final Server server) { 
    LOG.debug("Hooking to JVM shutdown events"); 

    server.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() { 

     @Override 
     public void lifeCycleStopped(LifeCycle event) { 
      LOG.info("Jetty Server has been stopped"); 
      super.lifeCycleStopped(event); 
     } 

    }); 

    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      LOG.info("About to stop Jetty Server due to JVM shutdown"); 
      try { 
       server.stop(); 
      } catch (Exception e) { 
       LOG.error("Could not stop Jetty Server properly", e); 
      } 
     } 
    }); 
} 

/** 
* @implNote {@link SparkFilter} needs to access a public class 
*/ 
@SuppressWarnings("WeakerAccess") 
public static class SparkApp implements SparkApplication { 

    @Override 
    public void init() { 
     System.setProperty("spring.profiles.active", ApplicationProfile.readProfilesOrDefault("dev").stream().collect(Collectors.joining())); 
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ModocContext.class); 
     ctx.registerShutdownHook(); 
    } 

}}