1. 程式人生 > >Spring boot 靜態資源處理以及攔截器的使用

Spring boot 靜態資源處理以及攔截器的使用

前言

本章主要圍繞WebMvcConfigurer,簡單介紹spring boot如何處理靜態資源以及使用攔截器的使用

靜態資源

spring boot預設為我們提供預設的配置方式

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

專案對應的目錄如下

優先順序順序為:META-INF/resources > resources > static > public

對應的配置檔案配置如下:

# 預設值為 /**
spring:
  mvc:
    static-path-pattern
: /** # #設定要指向的路徑,預設值為: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ resources: static-locations: 設定要指向的路徑

我們可以通過修改static-path-pattern的值改變其預設的對映,如改成

spring:
  mvc:
    static-path-pattern: /test/**

則訪問static 等目錄下的test.html檔案,應該為:localhost:8080/test/test.html

使用WebMvcConfigurer配置SpringMVC

spring boot 2.0以下的版本是通過WebMvcConfigurerAdapter介面來配置的,而spring boot 2.*則是通過WebMvcConfigurer進行配置

這裡主要講解幾個常用的實現如靜態資源處理、自定義檢視控制器、攔截器的的使用,新增ConfigurerAdapter.class,實現WebMvcConfigurer介面

@Configuration
public class ConfigurerAdapter implements WebMvcConfigurer {

}

我們在配置類上添加了註解@Configuration,標明瞭該類是一個配置類並且會將該類作為一個SpringBean新增到IOC容器內

新增靜態資源處理

在ConfigurerAdapter實現addResourceHandlers方法

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 通過addResourceHandler新增對映路徑,然後通過addResourceLocations來指定路徑
        registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
    }

在resources下新增目錄my,並新增檔案mytest.html,進行訪問測試

指定外部的目錄

通常用於圖片上傳後的訪問

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        
        //自定義外部靜態資源
        registry.addResourceHandler("/my/**").addResourceLocations("D:\\data\\file");

    }

addResourceLocations指的是檔案放置的目錄,addResoureHandler指的是對外暴露的訪問路徑

自定義檢視控制器

以前要訪問一個頁面需要先建立個Controller控制類,再寫方法跳轉到頁面,通過實現addViewControllers方法就不需要那麼麻煩了,直接訪問http://localhost:8080/login.html就跳轉到login頁面了

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

        // 對 "/admin" 的 請求 redirect 到登入頁面
        registry.addRedirectViewController("/admin", "/user/login");
       
        // 將 "login.html" 的 請求響應跳轉到登入頁面
        registry.addViewController("/home").setViewName("/user/login");

        // 對 "/hello/**" 的請求 返回 404 的 http 狀態
        registry.addStatusController("/hello/**", HttpStatus.NOT_FOUND);
    }

攔截器的使用

建立我們常用的登入攔截器 根據session中是否有user物件來判斷是否登入,為空就跳轉到登入頁,不為空就通過。

/**
 * 登入攔截器
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(true);

        //如果session不存在,就重定向到登入頁面
        if(session.getAttribute("user") == null){
            response.sendRedirect(request.getContextPath()+"/user/login");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

接著,在之前的ConfigurerAdapter類中實現addInterceptors方法如下:

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 登入攔截器,並新增過濾規則
         */
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login.html","/login","/css/**","/js/**");
    }

addPathPatterns("/**")對所有請求都攔截,但是排除了/login.html、/login和靜態資源請求的攔截。 spring boot 2.0對靜態資源也進行了攔截,當攔截器攔截到請求之後,但controller裡並沒有對應的請求,該請求會被當成是對靜態資源的請求。因此這裡也要新增對靜態資源的過濾

總結

到這裡靜態資源和攔截器的使用就介紹完了,有關WebMvcConfigurer的更多用法,可以檢視官方文件

官方文件

專案原始碼

開源後臺管理系統

歡迎體驗Aurora