Springboot中靜態資源和攔截器處理
背景: 在專案中我使用了自定義的Filter 這時候過濾了很多路徑,當然對靜態資源我是直接放過去的,但是,還是出現了靜態資源沒辦法訪問到springboot預設的資料夾中得檔案
說下預設對映的資料夾有:
classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
上面這幾個都是靜態資源的對映路徑,優先順序順序為:META-INF/resources > resources > static > public
我們可以通過修改spring.mvc.static-path-pattern來修改預設的對映**
,
*************************接管Spring Boot的Web配置 ************************這是重點中得重點********************
如果Spring Boot提供的Sping MVC不符合要求,則可以通過一個配置類(註解有@Configuration的類)加上@EnableWebMvc註解來實現完全自己控制的MVC配置。
當然,通常情況下,Spring Boot的自動配置是符合我們大多數需求的。在你既需要保留Spring Boot提供的便利,有需要增加自己的額外的配置的時候,可以定義一個配置類並繼承WebMvcConfigurerAdapter,無需使用@EnableWebMvc註解。
這裡我們提到這個WebMvcConfigurerAdapter這個類,重寫這個類中的方法可以讓我們增加額外的配置
自定義資源對映addResourceHandlers
比如,我們想自定義靜態資源對映目錄的話,只需重寫addResourceHandlers方法即可。
通過addResourceHandler新增對映路徑,然後通過addResourceLocations來指定路徑。我們訪問自定義my資料夾中
@Configuration public class MyWebMvcConfigurerAdapter extendsWebMvcConfigurerAdapter { /** * 配置靜態訪問資源 * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/"); super.addResourceHandlers(registry); } }
如果你想指定外部的目錄也很簡單,直接addResourceLocations指定即可,程式碼如下:
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/"); super.addResourceHandlers(registry); }
addResourceLocations指的是檔案放置的目錄,addResoureHandler指的是對外暴露的訪問路徑
頁面跳轉addViewControllers
以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然後再寫一個方法跳轉到頁面,感覺好麻煩,其實重寫WebMvcConfigurerAdapter中的addViewControllers方法即可達到效果了
/** * 以前要訪問一個頁面需要先建立個Controller控制類,再寫方法跳轉到頁面 * 在這裡配置後就不需要那麼麻煩了,直接訪問http://localhost:8080/toLogin就跳轉到login.jsp頁面了 * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/toLogin").setViewName("login"); super.addViewControllers(registry); }
攔截器在我們專案中經常使用的,這裡就來介紹下最簡單的判斷是否登入的使用。
要實現攔截器功能需要完成以下2個步驟:
- 建立我們自己的攔截器類並實現 HandlerInterceptor 介面
- 其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類新增進來即可
首先,自定義攔截器程式碼:
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean flag =true; User user=(User)request.getSession().getAttribute("user"); if(null==user){ response.sendRedirect("toLogin"); flag = false; }else{ flag = true; } return flag; } @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 { } }
這裡我們簡單實現了根據session中是否有User物件來判斷是否登入,為空就跳轉到登入頁,不為空就通過。
接著,重寫WebMvcConfigurerAdapter中的addInterceptors方法如下:
/** * 攔截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns 用於新增攔截規則 // excludePathPatterns 使用者排除攔截 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login"); super.addInterceptors(registry); }
addPathPatterns("/**")對所有請求都攔截,但是排除了/toLogin
和/login
請求的攔截