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