SpringBoot------自定义拦截器

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执行->拦截后->过滤后

另附:

原文地址:https://www.cnblogs.com/tianhengblogs/p/9784817.html

时间: 2024-10-13 02:12:48

SpringBoot------自定义拦截器的相关文章

springboot 2.0+ 自定义拦截器 静态资源问题

之前项目的springboot自定义拦截器使用的是继承WebMvcConfigurerAdapter重写常用方法的方式来实现的.静态文件不需要进行放行,springboot会自动帮你放行. springboot2.0之后如果想要自定义的话就不可以了,需要手动放行静态资源.此处我是实现了WebMvcConfigurer来自定义拦截器(根据需求也可以继承WebMvcConfigurationSupport,此处不再赘述).下面是实现代码 @Configuration public class MyM

Idea基于springBoot的拦截器的简单实现

一.创建SpringBoot项目二.配置文件:1.启动文件InterceptortestApplication.java package com.jane.interceptortest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.

springboot+springmvc拦截器做登录拦截

springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration 实现 WebMvcConfigurer 接口,注册拦截器 ResourceBundle 加载 properties文件数据,配置不进行拦截的路径 LoginInterceptor package com.ytkj.smart_sand.system.interceptor; import com.

springboot的拦截器中注入redisTemplate为null的解决办法

原因:拦截器加载于IOC之前,所以这个时候注入RedisTemplate时是null 在SpringBoot配置类中做出如下调整,将自定义拦截器也加入到配置中,在拦截器执行的时候实例化拦截器Bean 原文地址:https://www.cnblogs.com/zj-mxcz/p/12422953.html

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).

struts2基础----&gt;自定义拦截器

这一章,我们开始struts2中拦截器的学习.内容较浅,慎看. 自定义拦截器 一.增加一个自定义的拦截器为类 package com.huhx.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class RegisterInterceptor extends AbstractInt

struts2 文件的上传下载 表单的重复提交 自定义拦截器

文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置为 post 需添加 <input type=“file”> 字段. Struts 对文件上传的支持 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传. 步骤:1. 在 Jsp 页面的文件上传表单里使用

springMVC --拦截器流程详细,使用和自定义拦截器

先看看拦截器都做些什么: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(PageView)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录): 4.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Loca

12.Struts2自定义拦截器

12.自定义拦截器 拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, 即在Acton方法执行之前或之后执行,以加强Action方法的功能. 例如,一般情况下,用户在打开某个页面之前,需要先登录,否则是无法对资源进行访问的.这就是权限拦截器. 1.定义拦截器类 自定义的拦截器类需要实现拦截器接口com.opensymphony.xwork2.interceptor.Intercep

Struts2自定义拦截器

自定义拦截器 1). 具体步骤 I. 定义一个拦截器的类 > 可以实现 Interceptor 接口 > 继承 AbstractInterceptor 抽象类 II然后在拦截器类的interceptor()方法中定义这个拦截器的功能 III. 在 struts.xml 文件配置. 1注册拦截器 <interceptors> <interceptor name="hello" class="com.atguigu.struts2.intercept