SpringBoot靜態資源映射、攔截器、過濾器使用


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/");
    }
View Code

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);
        }
    }
}
View Code

  將攔截器實例注冊到spring容器中示例如下

@Configuration
public class RequestConfig implements WebMvcConfigurer {

    @Resource
    private DemoInterceptor demoInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加攔截器,配置攔截地址
        registry.addInterceptor(demoInterceptor).addPathPatterns("/**");
    }
}
View Code

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("過濾器銷毀");
    }
}
View Code

  使用配置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 ...");
    }

}
View Code
@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;
    }
}
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM