2015-09-17 8 views
5

Sto giocando con Spark (il framework web Java, non Apache Spark).Come si può utilizzare un filtro servlet nativo quando si utilizza Spark Web Framework?

Trovo molto bello e facile definire percorsi e filtri, tuttavia sto cercando di applicare un filtro di servlet nativo ai miei percorsi e non riesco a trovare un modo per farlo.

In particolare, mi piacerebbe utilizzare Jetty's DoSFilter che è un filtro servlet (in contrasto con la definizione Spark Filter). Dato che Spark sta utilizzando Jetty incorporato, non ho un web.xml per registrare DoSFilter. Tuttavia, Spark non espone l'istanza del server, quindi non riesco a trovare un modo elegante di registrare il filtro in modo programmatico.

C'è un modo per applicare un filtro di servlet nativo ai miei percorsi?

Ho pensato di avvolgere il filtro DoSFilter nel mio filtro Spark, ma mi è sembrata un'idea bizzarra.

+0

ehi hai trovato un modo per utilizzare i filtri servlet a scintilla? o almeno come inizializzare il server jetty e aggiungere spark come servlet? – jfplataroti

+0

È passato un po 'di tempo dall'ultima volta che l'ho guardato, ma c'è un modo per invertire il controllo e incorporare la scintilla in un'app Web anziché eseguire Jetty tramite spark - http://sparkjava.com/documentation.html#other-webserver. Ricordo di aver guardato attraverso il codice sorgente e sembrava piuttosto semplice da configurare. Spero possa aiutare. – elanh

+0

Questo è probabilmente un duplicato di https://stackoverflow.com/questions/14390577/how-to-add-servlet-filter-with-embedded-jetty? –

risposta

0

Si può fare in questo modo:

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

}} 
Problemi correlati