在 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>