2013-10-23 17 views
8

Sto lavorando con Jetty incorporato e voglio aggiungere un filtro servlet per verificare l'autenticazione prima di ogni richiesta. Ho provato a seguire this example ma sembra che la firma sia cambiata.Java/Jetty: Come aggiungere il filtro al jetty incorporato

<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-server</artifactId> 
    <version>9.0.4.v20130625</version> 
</dependency> 

mio Jetty di avviamento si presenta così:

public class JettyStarter { 

    public static void main(final String[] args) throws Exception { 
     Server server = new Server(8080); 
     final ServletHolder servletHolder = new ServletHolder(new CXFServlet()); 
     final ServletContextHandler context = new ServletContextHandler(); 
     context.setContextPath("/"); 
     // context.addFilter(AuthenticationFilter.class, "/*", FilterMapping.REQUEST); 
     context.addServlet(servletHolder, "/platform/*"); 
     context.addEventListener(new ContextLoaderListener()); 
     context.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName()); 
     context.setInitParameter("contextConfigLocation", Config.class.getName()); 
     server.setHandler(context); 
     server.start(); 
     server.join(); 
    } 
} 

Quando il commento dalla riga

// context.addFilter(AuthenticationFilter.class, "/*", FilterMapping.REQUEST); 

Trovo che la firma è cambiato. Quindi, voglio fare un piccolo passo indietro e chiedere, con Jetty incorporato, come faccio ad aggiungere un filtro che viene eseguito all'inizio della richiesta e consente alla richiesta di continuare solo se viene soddisfatta una condizione?

L'inizio della classe AuthenticationFilter si presenta così:

import javax.servlet.*; 
import java.io.IOException; 

public class AuthenticationFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest servletRequest, 
         ServletResponse servletResponse, 
         FilterChain filterChain) throws IOException, ServletException {} 

    @Override 
    public void destroy() {} 

} 
+0

Non capisco. Cosa c'è di sbagliato nel metodo 'addFilter'? –

+1

Ciao Sotirios, grazie per la risposta, sembra che la firma sia ora diversa e il terzo argomento 'FilterMapping.REQUEST' ora deve essere racchiuso in un enum set. Non ci sono esempi su questo ovunque che abbia visto ancora. –

risposta

16

Probabilmente si sta cercando EnumSet.of(DispatcherType.REQUEST), incluso un esempio completo di seguito:

import java.io.IOException; 
import java.util.EnumSet; 

import javax.servlet.DispatcherType; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.ServletHandler; 

public class JettyFilter { 

    public static void main(final String[] args) throws Exception { 
    Server server = new Server(8080); 

    ServletHandler handler = new ServletHandler(); 
    server.setHandler(handler); 

    handler.addServletWithMapping(HelloServlet.class, "/*"); 
    handler.addFilterWithMapping(HelloPrintingFilter.class, "/*", 
     EnumSet.of(DispatcherType.REQUEST)); 

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

    public static class HelloServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     response.setContentType("text/html"); 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.getWriter().println("<h1>Hello SimpleServlet</h1>"); 
    } 
    } 

    public static class HelloPrintingFilter implements Filter { 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
     System.out.print("hello from filter"); 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 

    } 

    @Override 
    public void destroy() {} 
    } 
} 
+0

Grazie Andrew, era quello che stavo cercando. Acclamazioni ~! –

+0

Sto aggiornando dal molo 6 al 9 .. qualsiasi riferimento è grato .. handler.addFilterWithMapping (HelloPrintingFilter.class, "/ *", 0); come nel molo 6 .. quello equivalente è DispatcherType.REQUEST ??? –

+0

Come si passa un 'FilterConfig' al filtro? 'handler.addFilterWithMapping (HelloPrintingFilter.class,"/* ", EnumSet.of (DispatcherType.REQUEST));' – Gobliins