1.靜態資源映射
(1)自動映射靜態資源文件
SpringBoot默認提供了靜態資源處理,使用WebMvcAutoConfiguration中的配置各種屬性。
建議使用SpringBoot的默認配置方式,提供的靜態資源映射如下:
- classpath:/META-INF/resources
- classpath:/resources
- classpath:/static
- classpath:/public
這幾個都是靜態資源的映射路徑,優先級順序為:META-INF/resources > resources > static > public。
(2)自定義映射靜態資源文件
SpringBoot幫我們預留的路徑下可以放置靜態文件外,我們也可以根據需求自定義靜態文件的放置位置,不過需要注意的時,在SpringBoot2.0前后,實現方式上是有變化的,SpringBoot2.0以前靜態資源的攔截、存放位置的指定等都是通過繼承WebMvcConfigurerAdapter來完成的,但是SpringBoot2.0以后需要通過實現WebMvcConfigurer重寫相關的方法來完成配置。代碼如下:

@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/image/**").addResourceLocations("classpath:/image/"); }
2.攔截器
SpringBoot中使用攔截器,可在以下情況執行操作 :
- 在將請求發送到控制器之前。
- 在將響應發送給客戶端之前。
例如,使用攔截器在將請求發送到控制器之前添加請求標頭,並在將響應發送到客戶端之前添加響應標頭。
SpringBoot自定義攔截器需實現攔截器接口,使用注冊接口對攔截器實例進行注冊。
自定義攔截器示例如下:

@Component public class DemoInterceptor implements HandlerInterceptor { /**用於在將請求發送到控制器之前執行操作。此方法應返回true,以將響應返回給客戶端。 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("請求開始 --- Url : " + request.getRequestURI()); return true; } /**用於在將響應發送到客戶端之前執行操作。 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("請求處理 --- Url : " + request.getRequestURI()); } /**用於在完成請求和響應后執行操作。 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("請求結束 --- Url : " + request.getRequestURI()); if (ex != null) { System.out.println("報錯信息 : "+ ex); } } }
將攔截器實例注冊到spring容器中示例如下:

@Configuration public class RequestConfig implements WebMvcConfigurer { @Resource private DemoInterceptor demoInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 添加攔截器,配置攔截地址 registry.addInterceptor(demoInterceptor).addPathPatterns("/**"); } }
3.過濾器
javax.servlet.Filter是一個接口,可以動態地攔截請求和響應信息,以變換或使用包含在請求或響應中的信息。
過濾器使用場景:
- 數據壓縮
- 記錄日志
- 數據統計
- 數據格式轉換
- 數據設置默認值
- 權限認證、黑白名單
- 數據加密/解密、簽名效驗
使用注解方式自定義過濾器示例如下:

/**自定義過濾器(注解方式) */ @Component @WebFilter(filterName = "myFilter", urlPatterns = {"/*"}, description = "自定義過濾器") public class MyCustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("過濾器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("before ..."); // 過濾器放行 filterChain.doFilter(servletRequest, servletResponse); System.out.println("after ..."); } @Override public void destroy() { System.err.println("過濾器銷毀"); } }
使用配置Bean方式自定義過濾器示例如下:

/**自定義過濾器(配置 Bean 方式) */ public class MyCustomFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("before ..."); // 過濾器放行 filterChain.doFilter(servletRequest, servletResponse); System.out.println("after ..."); } }

@Configuration public class FilterConfig { /**代碼方式注冊Bean */ @Bean public FilterRegistrationBean customFilter(){ FilterRegistrationBean<MyCustomFilter> filterBean = new FilterRegistrationBean<>(); filterBean.setFilter(new MyCustomFilter()); filterBean.setName("FilterController"); filterBean.addUrlPatterns("/*"); return filterBean; } }