SpringBootでフィルターを作成する
この投稿では、すべてのURLまたは特定のURLパターンにのみ適用できるSpringBootアプリケーションでカスタムフィルターを作成する方法について説明します。
SpringBootアプリケーションにフィルタークラスを登録する方法はいくつかあります。
1.フィルターインターフェイスを実装します
カスタムフィルターを作成するには、 Filter
インターフェースを作成し、次のようなSpringステレオタイプの1つでフィルターに注釈を付けます。 @Component
春がそれを認識するために。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; System.out.println("Request URI is: " + req.getRequestURI()); chain.doFilter(request, response); System.out.println("Response Status Code is: " + res.getStatus()); } } |
抽象クラスを拡張することもできます OncePerRequestFilter
フィルタに注釈を付けます @Component
。これを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { System.out.println("Request URI is: " + httpServletRequest.getRequestURI()); filterChain.doFilter(httpServletRequest, httpServletResponse); System.out.println("Response Status Code is: " + httpServletResponse.getStatus()); } } |
2.タイプFilterRegistrationBeanの@Beanを登録します
上記のフィルターはすべてのリクエストに適用されます。フィルタを特定のURLパターンにのみ適用する場合は、 @Component
フィルタクラス定義からの注釈と登録 @Bean
タイプの FilterRegistrationBean
春に @Configuration
.
たとえば、次のフィルタは一致するURLに適用されます /execute/*
パターン。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; System.out.println("Request URI is: " + req.getRequestURI()); chain.doFilter(request, response); System.out.println("Response Status Code is: " + res.getStatus()); } @Bean public FilterRegistrationBean<MyFilter> filter() { FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new MyFilter()); bean.addUrlPatterns("/execute/*"); //または、 `setUrlPatterns()`を使用します return bean; } } |
3.サーブレットの@WebFilterアノテーションを使用する
サーブレットアノテーションも使用できます @WebFilter
特定のURLパターンのみを受け入れるフィルターを宣言します。以来 @WebFilter
Springの注釈ではないので、使用する必要があります @ServletComponentScan
それを登録するための注釈。これは一緒に追加できます @SpringBootApplication
Mainクラスのアノテーション。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(urlPatterns = "/execute/*") public class FirstFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; System.out.println("Request URI is: " + req.getRequestURI()); chain.doFilter(request, response); System.out.println("Response Status Code is: " + res.getStatus()); } } |
これで、SpringBootでフィルターを作成できます。