2016-07-07 5 views
9

私はspring-bootに出会い、着信要求のためのフィルタチェーンを追加しようとしています。ここスプリング・ブートでフィルタ・チェーンを設定する方法は?

アプリケーションである:ここ

package example.hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
    } 

} 

コントローラーである:ここ

package example.hello; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.concurrent.atomic.AtomicLong; 

@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/greeting") 
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
     return new Greeting(counter.incrementAndGet(), 
       String.format(template, name)); 
    } 
} 

は、フィルタ構成である:ここ

package example.hello; 

import org.springframework.boot.context.embedded.FilterRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class WebConfig { 

    @Bean 
    public FilterRegistrationBean greetingFilterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     registrationBean.setName("greeting"); 
     GreetingFilter greetingFilter = new GreetingFilter(); 
     registrationBean.setFilter(greetingFilter); 
     registrationBean.setOrder(1); 
     return registrationBean; 
    } 

    @Bean 
    public FilterRegistrationBean helloFilterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
     registrationBean.setName("hello"); 
     HelloFilter helloFilter = new HelloFilter(); 
     registrationBean.setFilter(helloFilter); 
     registrationBean.setOrder(2); 
     return registrationBean; 
    } 

} 

はHelloFilterと挨拶フィルタである:

package example.hello; 

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

public class HelloFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     System.out.println("HelloFilter!"); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

package example.hello; 

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

public class GreetingFilter implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     System.out.println("Greetings from filter!"); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

curl localhost:8080/greetingを起動すると、「Greetings from filter」のみが受信され、HelloFilterは呼び出されません。

さらに、Greeting Controllerからの返答はありません。 GreetingFilterが手順をブロックしているようです。

したがって、スプリングブートでフィルタチェーンを設定する方法。上記のコードにバグはありますか? GreetingFilterに次のコード行を追加し

+5

コードに欠陥があります...あなたが通過しない最初のフィルターでteリクエストを停止/ブロックします。コールを続行するには、 'filterChain.doFilter(request、response)'を呼び出す必要があります... –

答えて

8

filterChain.doFilter(servletRequest, servletResponse); 
1

に動作します私はちょうどギャンガダーが提案した内容に、もう少し明確にしたいと思います。以下を追加してみることができます:

filterChain.doFilter(servletRequest、servletResponse);

あなたのフィルタクラスのdoFilterメソッドで。これは、フィルタの連鎖を作成します。

関連する問題