类似以前SpringMVC的拦截器,但也有一些区别

SpringBoot的拦截器有两种方式:

第一种方式:过时的方式,适用于SpringBoot1.x的方式

package org.dreamtech.springboot.interceptor;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @SuppressWarnings("deprecation")
public class CustomWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/test/*/**");
super.addInterceptors(registry);
}
}

第二种方式:基于Java8与Spring5的方式

原理:在WebMvcConfigurer接口中定义了默认方法,利用Java8新特性:接口中可以写方法

package org.dreamtech.springboot.interceptor;

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) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/login/*/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}

LoginInterceptor:只是实现了三个基本方法,分别打印一句话,了解执行顺序:

package org.dreamtech.springboot.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor {
/**
* 拦截之前调用(进入Controller之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("[ preHandle LoginInterceptor ]");
return HandlerInterceptor.super.preHandle(request, response, handler);
} /**
* 调用方法之后,视图渲染之前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[ postHandle LoginInterceptor ]");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
} /**
* 完成拦截之后,用于清理资源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[ afterCompletion LoginInterceptor ]");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

Controller:

package org.dreamtech.springboot.controller;

import java.util.HashMap;
import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class DemoController { @RequestMapping("/login/account")
private Object account() {
Map<String, Object> modelMap = new HashMap<String, Object>();
modelMap.put("money", 1000);
System.out.println("[ account DemoController ]");
return modelMap;
}
}

访问localhost:8080/login/account打印情况如下:

[ preHandle LoginInterceptor ]
[ account DemoController ]
[ postHandle LoginInterceptor ]
[ afterCompletion LoginInterceptor ]

如果没有以上打印,要注意这几点:

1.是否有@Configuration注解

2.是否将拦截路径写成/xxx/*/**,如果是/xxx/*/*就会拦截失败

同样地,我们可以添加多个拦截器

        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/login/*/**");
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/test/*/**");
registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/demo/*/**");

或者链式调用:拦截所有路径,但不包括/login

registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");

多个拦截器的调用顺序:可以理解为包裹的方式

package org.dreamtech.springboot.interceptor;

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) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/login/*/**");
registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/login/*/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}

DemoInterceptor和LoginInterceptor内容基本一致

最终的打印:

[ preHandle LoginInterceptor ]
[ preHandle DemoInterceptor ]
[ account DemoController ]
[ postHandle DemoInterceptor ]
[ postHandle LoginInterceptor ]
[ afterCompletion DemoInterceptor ]
[ afterCompletion LoginInterceptor ]

最后:

Filter和Interceptor的区别:

1.Filter基于Servlet,而Interceptor不依赖于Servlet容器

2.Filter只在容器被初始化的时候被调用一次,Interceptor次数没有限制

3.Interceptor基于AOP思想,Filter基于doFilter方法

两者的执行顺序:

过滤前->拦截前->Controller->拦截后->过滤后

SpringBoot 2.x (7):拦截器的更多相关文章

  1. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...

  2. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  3. 如何在SpringBoot项目中使用拦截器

    相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...

  4. springboot中配置了拦截器后,拦截器无效的解决方案之一

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  5. SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

    在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...

  6. springBoot 2.X-自定义拦截器

    package com.cx.springboot.myInter; import javax.servlet.http.HttpServletRequest; import javax.servle ...

  7. springboot 2.0+ 自定义拦截器

    之前项目的springboot自定义拦截器使用的是继承WebMvcConfigurerAdapter重写常用方法的方式来实现的. 以下WebMvcConfigurerAdapter 比较常用的重写接口 ...

  8. 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表

    利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...

  9. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...

  10. springboot(五).如何在springboot项目中使用拦截器

    在每个项目中,拦截器都是我们经常会去使用的东西,基本上任一一个项目都缺不了拦截器的使用. 如日志记录.登录验证,session验证等,都需要拦截器来拦截URL请求,那springboot中的拦截器是如 ...

随机推荐

  1. MySQL table

    -- 使用数据库hr use hr; -- 在数据库中创建表-- ------------------------------------JOBS表-------------------------- ...

  2. ODC(Orthogonal Defect Classification)简介——正交缺陷分类法

    Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改 ...

  3. 「网络流24题」「LuoguP4014」 分配问题

    Description 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为 cij.试设计一个将 n 件工作分配给 n 个人做的分配方案,使产生的总效益最大. Input 文 ...

  4. Sorting a Three-Valued Sequence

    链接 分析:首先我们先对其进行排序,并看排序以后有多少个元素顺序是对的,接着我们看有多少个元素经过一次交换可以得到的,最后剩下的元素就是经过两次交换可以得到的了. /* PROB:sort3 ID:w ...

  5. EJ20170430-hm

    alignment  n. 结盟; 队列,排成直线; 校直,调整; [工] 准线 aspect ratio  n. 宽高比; 纵横比,屏幕高宽比 aspect   n. 方面; thick   n.  ...

  6. Codeforces - 702A - Maximum Increase - 简单dp

    DP的学习计划,刷 https://codeforces.com/problemset?order=BY_RATING_ASC&tags=dp 遇到了这道题 https://codeforce ...

  7. lightoj1079【背包】

    题意: 哈利波特抢银行... 给出n个银行,每个银行有a[i]百万和b[i]的风险.然后再给一个风险值P,不能超过P. 思路: 如果告诉你概率的小数的位数,可能这个就会不一样了... 慨率的计算,风险 ...

  8. hdoj1260【简单DP】

    这题就是一个人买还是两个人买,直接选择一下,而且默认是排好了的,就是DP一下,可能不知道DP的人,也是这么写的吧.DP是一种思想啊. #include <bits/stdc++.h> us ...

  9. jQuery笔记之遍历索引(补充)

    遍历索引的相关方法: .each() .补充.children() .index() --------------------------------------------------------- ...

  10. POJ 1151 Atlantis(扫描线)

    题目原链接:http://poj.org/problem?id=1151 题目中文翻译: POJ 1151 Atlantis Time Limit: 1000MS   Memory Limit: 10 ...