SpringBoot------自定義攔截器

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執行->攔截後->過濾後

 

另附:函數

 

相關文章
相關標籤/搜索