1.添加pom.xml使用的依賴
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>top.ytheng</groupId> <artifactId>springboot-demo</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency> </dependencies> <build> <!-- 打包的名稱 --> <finalName>myspringboot</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
2.添加攔截器Login業務類
package top.ytheng.demo.intecpter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 攔截器業務類 * * */ public class LoginIntecepter implements HandlerInterceptor { /** * 調用Controller之前 * * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("LoginIntecepter------>preHandle"); //這里可以做一些access_token的校驗 String token = request.getParameter("token"); System.out.println(token); return HandlerInterceptor.super.preHandle(request, response, handler); } /** * 調用完Controller之后,視圖渲染之前 * * */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println("LoginIntecepter------>postHandle"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } /** * 整個完成之后 * * */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println("LoginIntecepter------>afterCompletion"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
3.添加攔截器2業務類
package top.ytheng.demo.intecpter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 攔截器業務類 * * */ public class TwoIntecepter implements HandlerInterceptor { /** * 調用Controller之前 * * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("TwoIntecepter------>preHandle"); return HandlerInterceptor.super.preHandle(request, response, handler); } /** * 調用完Controller之后,視圖渲染之前 * * */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub System.out.println("TwoIntecepter------>postHandle"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } /** * 整個完成之后 * * */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub System.out.println("TwoIntecepter------>afterCompletion"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
4.添加自定義攔截器
package top.ytheng.demo.intecpter; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /* * 自定義攔截器 * * */ @Configuration public class CustomWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // TODO Auto-generated method stub //攔截全部/** //最后一個必須為/**,如果是目錄的話則是/*/ //第一個攔截器 registry.addInterceptor(new LoginIntecepter()).addPathPatterns("/api2/*/**"); //排除攔截的地址 // .excludePathPatterns("/api2/xxx"); //第二個攔截器 registry.addInterceptor(new TwoIntecepter()).addPathPatterns("/api2/*/**"); WebMvcConfigurer.super.addInterceptors(registry); } }
5.添加控制器
package top.ytheng.demo.controller; import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api2/v1") public class CustomIntecepterController { @GetMapping("/test/filter") public Object testFilter() { System.out.println("CustomIntecepterController------>testFilter"); Map<String, Object> map = new HashMap<>(); map.put("username", "theng"); map.put("password", "123"); return map; } }
6.添加啟動類
package top.ytheng.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication //等於下面3個 //@SpringBootConfiguration //@EnableAutoConfiguration //@ComponentScan //Filter,攔截器用到 @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
7.右鍵項目Run As啟動,測試地址
http://localhost:8080/api2/v1/test/filter
測試結果截圖:
總結:
1.自定義攔截器 HandlerInterceptor preHandle:調用Controller某個方法之前 postHandle:Controller之后調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法 afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理 2.按照注冊順序進行攔截,先注冊,先被攔截 攔截器不生效常見問題: 1)是否有加@Configuration 2)攔截路徑是否有問題** 和 * 3)攔截器最后路徑一定要"/**",如果是目錄的話則是/*/ Filter 是基於函數回調doFilter(),而Interceptor則是基於AOP思想; 只在Servlet前后起作用,而Interceptor能夠深入到方法前后,異常拋出前后等; 依賴於Servlet容器即Web應用中,而Interceptor不依賴於Servlet容器,所以可以運行在多種環境中; 在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次; 3.Filter和Interceptor的執行順序 過濾前->攔截前->action執行->攔截后->過濾后
另附: