1.添加pom.xml使用的依賴java
<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業務類web
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業務類spring
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.添加自定義攔截器apache
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.添加控制器api
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.添加啓動類springboot
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啓動,測試地址app
http://localhost:8080/api2/v1/test/filter
測試結果截圖:maven
總結:ide
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執行->攔截後->過濾後
另附:函數