1. 程式人生 > >springboot乾貨——(三)靜態資源與攔截器

springboot乾貨——(三)靜態資源與攔截器

前言

前面兩章主要介紹了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時放行。