1. 程式人生 > >SpringBoot中使用自定義攔截器

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;
import
javax.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 { @Override
public 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的使用進行講解。