攔截器對使用SpringMvc的開發人員來說特別熟悉,因為你只要想去做好一個專案必然會用到它,攔截器在我們平時的專案中用處有很多,如:日志記錄、用戶登錄狀態攔截、安全攔截等等,而SpringBoot內部集成的是SpringMVC控制框架,所以使用起來跟SpringMVC沒有區別,只是在配置上有點不同,本文只介紹如何在springboot中使用攔截器的基本方式,
環境/版本一覽:
- 開發工具:Intellij IDEA 2020.2.3
- springboot:2.3.7.RELEASE
- jdk:1.8.0_211
- maven: 3.6.3
專案結構

搭建專案
- pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.niu</groupId>
<artifactId>springboot-interceptor</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>springboot-interceptor</name>
<description>springboot攔截器使用</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 寫一個控制器,加入一個介面
package com.niu.springbootinterceptor.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description: 控制器
* @author: nxq email: niuxiangqian163@163.com
* @createDate: 2020/12/22 3:28 下午
* @updateUser: nxq email: niuxiangqian163@163.com
* @updateDate: 2020/12/22 3:28 下午
* @updateRemark:
* @version: 1.0
**/
@RestController
public class MyController {
@GetMapping("test")
public Object test(){
System.out.println("test介面");
return "ok";
}
}
- 撰寫攔截器
package com.niu.springbootinterceptor.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @description: 攔截器
* @author: nxq email: niuxiangqian163@163.com
* @createDate: 2020/12/22 3:26 下午
* @updateUser: nxq email: niuxiangqian163@163.com
* @updateDate: 2020/12/22 3:26 下午
* @updateRemark:
* @version: 1.0
**/
public class MyInterceptor implements HandlerInterceptor {
/**
* 訪問介面之前攔截
* 可以做登陸判斷、訪問權限判斷、記錄日志,,,
* 方法return true是允許訪問介面 return false是拒絕訪問
* @return boolean
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("準備訪問介面");
return true; //放行所有介面
}
//在controller方法執行完畢執行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("controller執行完畢");
}
//可以在這里捕捉例外
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("頁面渲染完成,準備回傳給客戶端");
}
}
- 撰寫配置類,加入攔截器
package com.niu.springbootinterceptor.config;
import com.niu.springbootinterceptor.interceptor.MyInterceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @description:
* @author: nxq email: niuxiangqian163@163.com
* @createDate: 2020/12/22 3:26 下午
* @updateUser: nxq email: niuxiangqian163@163.com
* @updateDate: 2020/12/22 3:26 下午
* @updateRemark:
* @version: 1.0
**/
@Component
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加攔截器并設定攔截的訪問路徑 *代表全匹配
// registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/test");
}
}
- 主類
package com.niu.springbootinterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootInterceptorApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootInterceptorApplication.class, args);
}
}
啟動測驗
- 訪問介面

- 控制臺列印

攔截器的基本使用說完了,但它在實際的場景應用作用十分強大,慢慢在實踐中探索吧
代碼已經推送至github:https://github.com/1603565290m/springboot-interceptor
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239624.html
標籤:其他
