Create filters in Spring Boot
This post will discuss how to create custom filters in a Spring Boot application that can apply to all URLs or only to certain URL patterns.
There are several ways to register a filter class in the Spring Boot application.
1. Implement the Filter interface
To create a custom filter, we can implement the Filter interface and annotate the filter with one of the Spring stereotypes, such as @Component for Spring to recognize it.
|
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()); } } |
We can also extend the abstract class OncePerRequestFilter and annotate the filter with @Component. This is demonstrated below:
|
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. Register a @Bean of type FilterRegistrationBean
The above filter applies to all requests. If we want our filter to only apply to certain URL patterns, we can remove the @Component annotation from our filter class definition and register a @Bean of type FilterRegistrationBean in Spring @Configuration.
For example, the following filter applies to URLs that match the /execute/* pattern.
|
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/*"); // or, use `setUrlPatterns()` return bean; } } |
3. Using Servlet’s @WebFilter annotation
We can also use Servlet annotation @WebFilter to declare a filter that accepts only certain URL patterns. Since @WebFilter is not a Spring’s annotation, we need to use @ServletComponentScan annotation to register it, which can be added along with @SpringBootApplication annotation in the Main class.
|
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()); } } |
That’s all about creating filters in Spring Boot.
Thanks for reading.
To share your code in the comments, please use our online compiler that supports C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and support our growth. Happy coding :)