温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • SpringMVC拦截器是什么及怎么使用

SpringMVC拦截器是什么及怎么使用

发布时间:2022-08-25 17:50:36 来源:亿速云 阅读:144 作者:iii 栏目: 开发技术

本文小编为大家详细介绍“SpringMVC拦截器是什么及怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringMVC拦截器是什么及怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

什么是拦截器

讲解拦截器的概念之前,我们先看一张图:

SpringMVC拦截器是什么及怎么使用

(1)浏览器发送一个请求会先到Tomcat的web 服务器

(2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源

(3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问

(4)如果是动态资源,就需要交给项目的后台代码进行处理

(5)在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行

(6)然后进入到到中央处理器(SpringMVC中的内容),SpringMVC会根据配置的规则进行拦截

(7)如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果

(8)如果不满足规则,则不进行处理

(9)这个时候,如果我们需要在每个Controller方法执行的前后添加业务,具体该如何来实现?

这个就是拦截器要做的事。

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

作用:

  • 在指定的方法调用前后执行预先设定的代码

  • 阻止原始方法的执行

  • 总结:拦截器就是用来做增强

看完以后,大家会发现

  • 拦截器和过滤器在作用和执行顺序上也很相似

所以这个时候,就有一个问题需要思考:拦截器和过滤器之间的区别是什么?

  • 归属不同:Filter(过滤器)属于Servlet技术,Interceptor(拦截器)属于SpringMVC技术

  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

SpringMVC拦截器是什么及怎么使用

拦截器入门案例

环境准备

创建一个Web的Maven项目

pom.xml添加SSM整合所需jar包

<?xml version="1.0" encoding="UTF-8"?>
<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>com.nefu</groupId>
  <artifactId>springmvc_try</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

创建对应的配置类

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}
@Configuration
@ComponentScan({"com.nefu.controller"})
@EnableWebMvc
public class SpringMvcConfig{
}

创建模型类Book

public class Book {
    private String name;
    private double price;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book{" +
                "书名='" + name + '\'' +
                ", 价格=" + price +
                '}';
    }
}

编写Controller

@RestController
@RequestMapping("/books")
public class BookController {
    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save..." + book);
        return "{'module':'book save'}";
    }
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id){
        System.out.println("book delete..." + id);
        return "{'module':'book delete'}";
    }
    @PutMapping
    public String update(@RequestBody Book book){
        System.out.println("book update..."+book);
        return "{'module':'book update'}";
    }
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("book getById..."+id);
        return "{'module':'book getById'}";
    }
    @GetMapping
    public String getAll(){
        System.out.println("book getAll...");
        return "{'module':'book getAll'}";
    }
}

拦截器开发

步骤1:创建拦截器类

我们可以创建一个拦截器文件夹,命名为interceptor,这个文件夹我们可以把它放在controller文件夹中,因为拦截器本来就与表现层有关。然后我们再在拦截器文件夹中创建一个拦截器类ProjectInterceptor:

SpringMVC拦截器是什么及怎么使用

让类实现HandlerInterceptor接口,重写接口中的三个方法。

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    //原始方法调用前执行的内容
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        return true;
    }
    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }
    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

注意:拦截器类要被SpringMVC容器扫描到。

拦截器中的preHandler方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了(你的原始方法也不会执行)。

步骤2:配置拦截器类

也就是配置你执行什么样的请求的时候你的拦截器会生效

配置拦截器的地方与我们前面配置页面静态资源放行的地方是一样的。

在配置的时候我们要把拦截器给添加进去,这里我们使用自动装配进行注入。

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //配置拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books" );
    }
}

注意:

//配置拦截器
 registry.addInterceptor(projectInterceptor).addPathPatterns("/books" );

如果向上面这样配置拦截器,那么你访问:

localhost/books/100

这样拦截器是不能生效的,你需要修改拦截器的配置:

//配置拦截器
 registry.addInterceptor(projectInterceptor).addPathPatterns("/books/*" );

也就是说他是从localhost后面那一级开始配置的

同时我们也可以配置多个:

//配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books/*" ,"/books" );//配置拦截器
 registry.addInterceptor(projectInterceptor).addPathPatterns("/books/*" ,"/books" );

步骤3:SpringMVC添加SpringMvcSupport包扫描

@Configuration
@ComponentScan({"com.nefu.controller","com.nefu.config"})
@EnableWebMvc
public class SpringMvcConfig{
}

步骤4:运行程序测试

使用PostMan发送http://localhost/books

SpringMVC拦截器是什么及怎么使用

如果发送http://localhost/books/100会发现拦截器没有被执行,原因是拦截器的addPathPatterns方法配置的拦截路径是/books,我们现在发送的是/books/100,所以没有匹配上,因此没有拦截,拦截器就不会执行。

步骤5:修改拦截器拦截规则

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //配置拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*" );
    }
}

这个时候,如果再次访问http://localhost/books/100,拦截器就会被执行。

最后说一件事,就是拦截器中的preHandler方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。

简化SpringMvcSupport的编写

@Configuration
@ComponentScan({"com.nefu.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置多拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
    }
}

此后咱们就不用再写SpringMvcSupport类了。

读到这里,这篇“SpringMVC拦截器是什么及怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

向AI问一下细节
推荐阅读:
  1. SpringMVC 拦截器理解
  2. 使用springmvc怎么实现一个限流拦截器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springmvc
  • 上一篇新闻:
    创建PHP一维数组并赋值的方法有哪些
  • 下一篇新闻:
    php如何将数组转为json数据,双引号转为单引号

猜你喜欢

  • 电商推广选择美国服务器有什么优势
  • 建站首选香港服务器的原因有哪些
  • 美国云服务器价格为什么不同
  • 美国云服务器优点是什么
  • 用户选择美国云服务器的原因有哪些
  • 香港云服务器搭建博客有什么好处
  • 用美国云服务器有什么优势
  • 如何选择美国云服务器更省钱
  • 租用香港云服务器建站有什么好处
  • 博客站群选择香港服务器好不好
最新资讯
  • 解释如何使用EXISTS子句在SQLite中进行条件查询
  • 在SQL Server中如何进行数据库迁移
  • 如何解决SQLite数据库的内存占用过高问题
  • SQLite数据库文件的加密与解密过程是怎样的
  • SQLite数据库过大时有什么清理或维护的方法可以减小文件大小
  • 解释SQL Server中的AlwaysOn功能
  • 描述SQLite数据库的备份和恢复流程
  • 如何在SQL Server中处理并发事务
  • 使用PRAGMA指令调优SQLite数据库有哪些技巧
  • 如何迁移SQLite数据库的数据到另一个SQL数据库
相关推荐
  • springmvc实现简单的拦截器
  • SpringMVC如何使用拦截器控制登录
  • 如何使用SpringMVC拦截器
  • SpringMVC拦截器的作用是什么
  • Java中SpringMVC拦截器怎么用
  • SpringMVC HandlerInterceptor拦截器的使用与参数是什么
  • Java SpringMVC中的拦截器如何使用
  • java SpringMvc中拦截器怎么用
  • SpringMVC拦截器创建配置及执行顺序是什么
  • SpringMVC拦截器怎么掌握

相关标签

springboot2 spring boot 入门 springcloud gateway mvc框架 mvcc spring cloud alibaba springsecurity asp.netmvc spring framework springaop springfox mvc模式 springcache spring面试 spring batch spring3 .net mvc springmvc4 spring.net spring-boot-maven-plugin
AI

代做工资流水公司成都打签证银行流水西宁开入职银行流水广州查个人流水莆田代办工资证明北京流水模板绍兴代开收入证明宁德查自存流水岳阳打印签证银行流水宜春办入职流水九江银行流水修改制作唐山企业对公流水代做新乡工资流水样本湘潭代开签证流水北京对公银行流水图片襄阳办薪资流水临沂办房贷银行流水厦门流水济南打印对公流水佛山工作收入证明代做舟山背调流水办理商丘企业对公流水长春银行流水电子版公司泰州背调流水查询大连工作收入证明打印泰安做转账流水兰州代办贷款工资流水唐山打流水单揭阳企业对公流水费用九江查询在职证明广州对公银行流水代开香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化