springboot中如何添加Interceptor拦截器

本案例是使用IDEA创建的maven的web项目



步骤一:在pom.xml中导入依赖

注意parent标签不在中

  <!--声明springboot版本-->
  <parent><!--注意该标签不在<dependencies>-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.5.RELEASE</version>
    <relativePath/>
  </parent>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>

    </dependency>
    <!-- mvc,aop的依赖包 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 由于我们在上面指定了parent,这里就不需要指定版本号 -->
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>
    <!--tomcat-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
    </dependency>
    <!-- 阿里巴巴的Druid数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>
    <!--pageHelper分页插件-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.0.0</version>
    </dependency>
    <!--quartz依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.3</version>
    </dependency>


  </dependencies>


步骤二:自定义拦截器(该类必须实现HandlerInterceptor接口)

该案例将该类命名为:MyInter1

package com.qf.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


//相当于MyInter1是HandlerInterceptor的实现类
public class MyInter1 implements HandlerInterceptor{//必须实现HandlerInterceptor接口重写当中的方法

    //拦截器开始时执行的方法
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("拦截器开始执行");
        return false;//默认值为false,代表不继续往后执行。如果为true,即使拦截了也依然会执行被拦截请求对应的controller层对应的方法。因此为true和没加拦截没区别
        // 为false的话,被拦截的请求不会被执行它对应的controller方法
    }

    //拦截器结束时执行的方法
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器结束执行 ");
    }

    //无论拦截器是否有异常都执行的方法
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("无论是否有异常拦截器都执行");
    }
}


步骤三:创建配置工具类。告诉拦截器我们拦截哪些请求。记得该类一定要加@Configuration注解

package com.qf.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration//表名这是个配置类。告诉springboot在加载配置时加载此类
public class InterceptorConfig extends WebMvcConfigurerAdapter {//继承WebMvcConfigurerAdapter
    @Override
    public void addInterceptors(InterceptorRegistry registry) {//重写WebMvcConfigurerAdapter中的addInterceptors方法
        registry.addInterceptor(new MyInter1())//new MyInter1()是我们自定义的拦截器类对象
                .addPathPatterns("/*")//  /*代表拦截所有请求。动态参数,多个参数以逗号隔开
                .excludePathPatterns("/insert");//不拦截/inser这个请求。这也是个动态参数,有多个不拦截的请求时,以逗号隔开
        super.addInterceptors(registry);
    }
}


步骤四:在controller层创建调用数据库数据,与页面交互的类(该类方法的请求地址就是我们拦截的对象)

package com.qf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class TestController {

    @RequestMapping("/insert")//访问此请求的地址是localhost:8080/test
    public void test(@RequestParam(defaultValue = "1") Integer pageindex, ModelMap map){
        System.out.println("111111");
    }
    @RequestMapping("/insert2")//访问此请求的地址是localhost:8080/test
    public void test(){
        System.out.println("2222");
    }
}


步骤五:在controller所在包的父包上创建启动类(即controller类所在包的上一个包)

该案例将该类命名为:StartBegin

package com.qf;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


//启动类一定要定义在controller类的父包中,也就是不在同一包中的上一级包
@SpringBootApplication//启动类的标志,必须在启动类上面加
public class StartBegin {
    public static void main(String[] args) {
        SpringApplication.run(StartBegin.class,args);//StartBegin代表本类对象
    }
}


该案例框架结构:

在这里插入图片描述

以下两个执行结果生效的前提是自定义拦截器即InterceptorConfig那的preHandle方法返回false
案例中未被拦截的/insert请求执行结果:
在这里插入图片描述
案例中被拦截的除/insert之外的请求执行结果:在这里插入图片描述




小思考,多个拦截器怎么设置?
就多了个自定义拦截器,多写了一道addInterceptor()方法
在这里插入图片描述

多个拦截器执行顺序:按照addInterceptor()方法顺序执行。如:拦截器执行1,拦截器执行2;拦截器结束2,拦截器结束1。总之按照先进后出原则

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值