2013-10-23 117 views
8

我正在使用嵌入式Jetty,並且我想在每個請求之前添加一個servlet過濾器以檢查身份驗證。我試過this example,但看起來簽名已經改變。Java/Jetty:如何將過濾器添加到嵌入式Jetty

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

我的碼頭起動看起來是這樣的:

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

當我取消對該行

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

我發現簽名已經改變。所以我想稍微回過頭來問一下嵌入式Jetty,如何添加一個在請求開始時運行的過濾器,並且只有滿足某些條件時才允許請求繼續運行?

的AuthenticationFilter類的開頭是這樣的:

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

我不明白。 'addFilter'方法有什麼問題? –

+1

嗨Sotirios,感謝您的回覆,它看起來像簽名現在是不同的,第三個參數'FilterMapping.REQUEST'現在需要包裹在一個枚舉集。在我看到的任何地方都沒有例子。 –

回答

16

您可能正在尋找EnumSet.of(DispatcherType.REQUEST),下面提供了一個完整的例子:

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

謝謝安德魯,那正是我正在尋找的。乾杯〜! –

+0

我從碼頭6升級到9 ..任何引用感謝.. handler.addFilterWithMapping(HelloPrintingFilter.class,「/ *」, 0);如在碼頭6 ..相當的一個是DispatcherType.REQUEST? –

+0

如何將'FilterConfig'傳遞給過濾器? 'handler.addFilterWithMapping(HelloPrintingFilter.class,「/ *」, EnumSet.of(DispatcherType.REQUEST));'' – Gobliins

相關問題