Configuring Servlets, Filters and Listeners in Spring Boot

In Spring Boot you can register Servlets, Filters, Listeners by using the ServletRegistrationBean, FilterRegistrationBean, and ServletListenerRegistrationBean bean definitions.

For example, consider the following Servlet example:

package com.example;

import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class DemoServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    resp.getWriter().write("called Servlet!");
  }
}

We can register DemoServlet using ServletRegistrationBean and map it to the URL pattern /myServlet, as shown in this example:

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Autowired private FilterServlet myServlet;

  @Bean
  public ServletRegistrationBean<DemoServlet> myServletBean() {
    ServletRegistrationBean<DemoServlet> servlet = new ServletRegistrationBean<>();
    servlet.setServlet(myServlet);
    servlet.addUrlMappings("/myServlet");
    return servlet;
  }
}

You can check that the DemoServlet is invoked, if you try to request http://localhost:8080/myServlet

called Servlet! 

By using this approach, you can take advantage of Spring’s dependency injection for servlets, filters, and listeners.

Implementing a Servlet Filter

In order to implement a Servlet Filter for your Requests, you can register the Filter on the org.springframework.boot.web.servlet.FilterRegistrationBean. this allows choosing the URL Patterns that binds the filter to the request. For example, here is how to activate the doFilter method when the URL pattern /demo is requested:

package com.example;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestFilter implements Filter {
  @Bean
  public FilterRegistrationBean<RequestFilter> loggingFilter() {
    FilterRegistrationBean<RequestFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new RequestFilter());
    registrationBean.addUrlPatterns("/demo");
    return registrationBean;
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    System.out.println("Called request " + req.getRequestURI());
    chain.doFilter(request, response);
    System.out.println("Response :" + res.getContentType());
  }
}

Please note that you can also annotate this class with @Component instead of @Bean but in this case the Filter will be execute for every request:

@Component
public class RequestFilter 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("Called request " + req.getRequestURI());
    chain.doFilter(request, response);
    System.out.println("Response :" + res.getContentType());
  }
}