在 Spring MVC 中所有的流量都会经过一个单一的 Servlet,那就是 Dispatcher Servlet (front Controller)。

Dispatcher Servlet 会控制所有的请求,并将他们转发给其他组件。

在 Spring MVC 中会创建网络应用,以及 REST 服务。在 MVC 应用中会定义在 web.xml 文件中。

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

或者这样

    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>600</session-timeout>
    </session-config>

Spring Boot 提供了 spring-boot-starter-web 库,其中主要的一个功能就是 Spring Boot 自动配置 ,Spring Boot 自动注册并配置 DispatchServlet 。

Spring boot 会自动配置 DispatcherServlet 到 / 这个 URL 地址。所以我们不需要其他额外的定义。但是可以通过在 application.properties 中配置来自定义 URL Pattern。比如:

server.servlet.context-path=/demo
spring.mvc.servlet.path=/custom_path

通过上面的配置,DispatcherServlet 会配置处理 URL pattern /custom_path 并且 root contextPath 是 /demo,因此 DispatcherServlet 会监听 http://localhost:8080/demo/custom_path

注册过滤器

实现一个过滤器

@Component
public class CustomFilter implements Filter {

    Logger logger = LoggerFactory.getLogger(CustomFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        logger.info("CustomFilter is invoked");
        chain.doFilter(request, response);
    }

    // other methods 
}

如果没有 Spring boot,需要在 web.xml 中配置:

<filter>
    <filter-name>customFilter</filter-name>
    <filter-class>CustomFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>customFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

reference