springboot乾貨——(三)靜態資源與攔截器
阿新 • • 發佈:2019-02-03
前言
前面兩章主要介紹了Spring Boot如何使用以及Spring Boot的執行原理,這章我們爭對web專案瞭解一下靜態資源以及攔截器。
正文
靜態資源
首先需要了解的是SpringBoot和之前的SpringMVC不太一樣,SpringBoot對jsp頁面的支援性很差,大家都知道jsp頁面一般用在tomcat伺服器上,而tomcat伺服器一般需要war直接執行,SpringBoot一般不打war,一般打成jar。Spring Boot 預設為我們提供了靜態資源處理,使用 WebMvcAutoConfiguration 中的配置各種屬性。
建議大家使用Spring Boot的預設配置方式,
看網上的一些帖子說,Spring Boot提供的靜態資源對映一般如下:
- classpath:/META-INF/resources
- classpath:/resources
- classpath:/static
- classpath:/public
上面這幾個都是靜態資源的對映路徑,優先順序順序為:META-INF/resources > resources > static > public
但是博主在建立一個簡單的web專案的時候,是沒有那邊多路徑的。一個簡單的web專案中靜態資源一般存放在resources目錄下的static資料夾中。因為對jsp的支援不是很好,所以一般會進行頁面靜態化使之變成html,頁面的模板放置在templates資料夾下。
另外,可以通過配置檔案來修改靜態資源存放的目錄
# 預設值為 /**
spring.mvc.static-path-pattern=
# 預設值為 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=這裡設定要指向的路徑,多個使用英文逗號隔開
我們可以通過修改spring.mvc.static-path-pattern來修改預設的對映,例如我改成/gwd/**,那執行的時候訪問 http://lcoalhost:8080/gwd/index.html 才對應到index.html頁面。攔截器
攔截器這玩意兒不多說了,一般寫過SpringMVC的應該都寫過,SpringBoot中本質上也差不多要實現攔截器功能需要完成以下2個步驟:
- 1.建立我們自己的攔截器類並實現 HandlerInterceptor 介面
- 2.其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類新增進來即可
package com.gwd.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println(">>>MyInterceptor>>>>>>>在整個請求結束之後被呼叫,也就是在DispatcherServlet 渲染了對應的檢視之後執行(主要是用於進行資源清理工作)");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println(">>>MyInterceptor>>>>>>>請求處理之後進行呼叫,但是在檢視被渲染之前(Controller方法呼叫之後)");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println(">>>MyInterceptor>>>>>>>在請求處理之前進行呼叫(Controller方法呼叫之前)");
return true;// 只有返回true才會繼續向下執行,返回false取消當前請求
}
}
package com.gwd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.gwd.interceptor.MyInterceptor;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用於新增攔截規則
// excludePathPatterns 使用者排除攔截
//addPathPatterns("/**")對所有請求都攔截,但是排除了/others和/login請求的攔截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*").excludePathPatterns("/login","/others");
super.addInterceptors(registry);
}
}
addPathPatterns對所有請求都攔截,但是排除了login和others(用逗號分隔開來)請求的攔截。Controller:
package com.gwd.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("/hello")
public String index() {
return "hello";
}
@RequestMapping("/login")
public String login() {
return "login";
}
}
當訪問hello時攔截器會攔截,進行列印,當訪問login時放行。