SpringBoot中使用自定義攔截器
一、新建一個SpringBoot工程,目錄結構如下:
二、在核心配置檔案application.properties中配置檢視解析器格式
#配置檢視解析器解析檔案的格式 spring.mvc.view.prefix=/ spring.mvc.view.suffix=.html
三、新建一個自定義攔截器類:LoginInteceptor.java,攔截器作用於請求進入到controller之前。
package cn.com.winson.interceptor; import javax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 自定義登入攔截器 * * @author lvhao * @date 2018年12月8日 * @time 上午10:14:37 */ public class LoginInterceptor implements HandlerInterceptor { @Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { }/*在請求進入到controller之前會呼叫此方法,所以在該方法中編寫攔截邏輯*/ @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("驗證登入認證,並遵守攔截器規則,現在放行"); /*這裡省略了攔截器的邏輯設計,直接認證通過*/ /*既然認證通過,返回值就為true,邏輯可以繼續往下執行*/ return true; } }
四、自定義攔截器攔截配置類(攔截規則)LoginInterceptorConfig.java類:該類繼承WebMvcConfigurerAdapter介面卡,並重寫其中的addInterceptors方法,新增一個攔截器及攔截規則。
注意:@Configuration註解的使用。
package cn.com.winson.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import cn.com.winson.interceptor.LoginInterceptor; /** * 自定義的登入攔截器的配置類 * * @author lvhao * @date 2018年12月8日 * @time 上午10:23:07 */ /* @Configuration註解:相當於是一個spring的配置檔案(applicationContext.xml) */ @Configuration public class LoginInterceptorConfig extends WebMvcConfigurerAdapter { /* 重寫WebMvcConfigurerAdapter方法:作用為新增一個攔截器,新增攔截器攔截規則 */ @Override public void addInterceptors(InterceptorRegistry registry) { /*攔截和不攔截的路徑引數都可以是陣列*/ String[] excludePathPatterns ={"/winson/login","/winson/logout"}; registry.addInterceptor(new LoginInterceptor()) /*表示對以winson開頭的請求地址都進行攔截*/ .addPathPatterns("/winson/**") /*表示對以winson開頭,後面緊跟著的是login的請求地址,不進行攔截,exclude表示排除*/ .excludePathPatterns(excludePathPatterns); /*攔截器可以同時存在好幾個,如下,我們再寫一個攔截*/ String[] tomexcludePathPatterns ={"/tom/login","/tom/logout"}; registry.addInterceptor(new LoginInterceptor()) /*表示對以winson開頭的請求地址都進行攔截*/ .addPathPatterns("/tom/**") /*表示對以winson開頭,後面緊跟著的是login的請求地址,不進行攔截,exclude表示排除*/ .excludePathPatterns(tomexcludePathPatterns); } }
五、新建一個IndexController.java,接收請求:
package cn.com.winson.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class IndexController { /*登入頁*/ @GetMapping("/winson/login") public String login() { return "login"; } /*退出頁*/ @GetMapping("/winson/logout") public String logout() { return "logout"; } /*使用者資訊列表頁*/ @GetMapping("/winson/userInfo") public String userInfo() { return "userInfo"; } }
六、新建三個頁面login.html、logout.html、userInfo.html內容如下:
注意:新建的頁面位置為:/src/main/webapp目錄下,這是SpringBoot檢視解析器尋找檢視的預設的位置。
login.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <center> <h2 style="color: red">登入頁</h2> <hr> </center> </body> </html>View Code
logout.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <center> <h1 style="color: green;">退出頁</h1> <hr> </center> </body> </html>View Code
userInfo.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <center> <hr> <h2 style="color: blue">使用者列表頁</h2> </center> </body> </html>View Code
七、測試方法:通過測試訪問各個頁面,檢視控制檯是否打印出“驗證登入認證,並遵守攔截器規則,現在放行”這段文字,判斷自定義的攔截器是否進行了驗證攔截器規則,如果列印該句話,證明攔截器起作用了,驗證攔截器規則;如果沒有列印,那麼說明攔截器沒有對該訪問路徑進行攔截器規則驗證,直接放行了。
八、執行程式,結果為:
訪問http://127.0.0.1:8080/winson/login:
結果:控制檯沒有列印這句話:“驗證登入認證,並遵守攔截器規則,現在放行”。
訪問http://127.0.0.1:8080/winson/logout:
結果:控制檯沒有列印這句話:“驗證登入認證,並遵守攔截器規則,現在放行”。
訪問:http://127.0.0.1:8080/winson/userInfo
結果:控制檯列印了這句話:“驗證登入認證,並遵守攔截器規則,現在放行”。
控制檯列印結果:
總結:
一、通過訪問頁面,控制檯是否列印資訊,簡單的驗證攔截器是否攔截請求。
二、請求是在進入到controller之前進行攔截認證的。
三、攔截認證規則可以自定義,我這裡沒有進行邏輯編寫,只是向控制檯列印資訊,來判斷攔截器的攔截是否起作用。
四、實際開發中,使用shio或者Spring Security來對登入認證,許可權管理進行開發,都是框架,不用自定義攔截器這種low的方法,但是他們的原理都是使用攔截器,故我這裡簡單介紹一下攔截器的工作原理和流程,以後有時間,我會將Spring Security的使用進行講解。