一:任务

1.任务

  过滤器Filter

  拦截器Interceptor

  切片Aspect

二:过滤器

1.新建包

  

2.自定义过滤器程序

  加了注解,这个过滤器在springboot中就起作用了

 1 package com.cao.web.filter;
 2
 3 import java.io.IOException;
 4 import java.util.Date;
 5
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12
13 import org.springframework.stereotype.Component;
14
15 //使得过滤器起作用
16 @Component
17 public class TimeFilter implements Filter {
18
19     @Override
20     public void init(FilterConfig filterConfig) throws ServletException {
21         System.out.println("time filter init");
22
23     }
24
25     @Override
26     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
27             throws IOException, ServletException {
28         System.out.println("time filter start");
29         //进行下一个调用链
30         long start=new Date().getTime();
31         chain.doFilter(request, response);
32         System.out.println("time filter 耗时: "+(new Date().getTime()-start));
33         System.out.println("time filter finish");
34
35     }
36
37     @Override
38     public void destroy() {
39         System.out.println("time filter destroy");
40
41     }
42
43 }

  将要访问的控制器

 1     @JsonView(User.UserDetailView.class)
 2     @GetMapping(value="/{id:\\d+}")
 3     public User getInfo(@PathVariable(value="id") String idid){
 4         /**
 5          *  演示filter调用
 6          */
 7         System.out.println("进入getInfo服务");
 8
 9         System.out.println("idtt="+idid);
10         User user=new User();
11         user.setUsername("tom");
12         return user;
13         /**
14          *  下面的主要是演示Spring booter异常的处理机制,现在先注释掉
15          */
16 //        throw new UserNotExistException(idid);
17
18     }

3.效果

  先启动,这个时候,过滤器一样会被启动

  

  进行访问

  

  效果

  

4.引用第三方Filter,加到过滤器链上

  在Spring boot上没有web.xml。

  新建一个过滤器,用于表示第三方的过滤器

 1 package com.cao.web.filter;
 2
 3 import java.io.IOException;
 4 import java.util.Date;
 5
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12
13 import org.springframework.stereotype.Component;
14
15 /**
16  * 假设这里是一个第三方的Filter,用来演示
17  * @author dell
18  *
19  */
20 public class TimeFilter2 implements Filter {
21
22     @Override
23     public void init(FilterConfig filterConfig) throws ServletException {
24         System.out.println("time filter init2");
25
26     }
27
28     @Override
29     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
30             throws IOException, ServletException {
31         System.out.println("time filter start2");
32         //进行下一个调用链
33         long start=new Date().getTime();
34         chain.doFilter(request, response);
35         System.out.println("time filter2 耗时: "+(new Date().getTime()-start));
36         System.out.println("time filter finish2");
37
38     }
39
40     @Override
41     public void destroy() {
42         System.out.println("time filter destroy2");
43
44     }
45
46 }

  新建一个包,为config

  新建一个类,为配置类

 1 package com.cao.web.config;
 2
 3
 4 import java.util.ArrayList;
 5 import java.util.List;
 6
 7 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 8 import org.springframework.context.annotation.Bean;
 9 import org.springframework.context.annotation.Configuration;
10
11 import com.cao.web.filter.TimeFilter2;
12
13 /**
14  *  这里相当于在配置web.xml
15  * @author dell
16  */
17
18 //说明这是一个配置类
19 @Configuration
20 public class WebConfig {
21     @Bean
22     public FilterRegistrationBean timeFilter2() {
23         //加入Filter
24         FilterRegistrationBean registrationBean=new FilterRegistrationBean();
25         TimeFilter2 timeFilter2=new TimeFilter2();
26         registrationBean.setFilter(timeFilter2);
27         //起作用的url
28         List<String> url=new ArrayList<>();
29         url.add("/*");
30         registrationBean.setUrlPatterns(url);
31         //返回
32         return registrationBean;
33
34     }
35 }

  启动

  

  访问

  

  发现,这里的服务只会走一次,外面包裹的是其过滤器的处理。

三:拦截器

1.过滤器的问题

  不知道是那个过滤器的哪个方法处理的。

  过滤器是Java EE提供的。

  拦截器是spring提供的。

  会拦截所有的控制器。

2.新建一个interception的包

  新建TimeInterception的程序

 1 package com.cao.web.config;
 2
 3
 4 import java.util.ArrayList;
 5 import java.util.List;
 6
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
12 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
13
14 import com.cao.web.filter.TimeFilter2;
15 import com.cao.web.interceptor.TimeInterceptor;
16
17 /**
18  *  这里相当于在配置web.xml
19  * @author dell
20  */
21
22 //说明这是一个配置类
23 @Configuration
24 public class WebConfig extends WebMvcConfigurerAdapter{
25
26     //已经把TimeInterceptor变成了spring的一个组件了,现在需要autowired进来
27     @Autowired
28     private TimeInterceptor timeInterceptor;
29
30     /**
31      * 这里是拦截器
32      */
33     @Override
34     public void addInterceptors(InterceptorRegistry registry) {
35         registry.addInterceptor(timeInterceptor);
36         super.addInterceptors(registry);
37     }
38
39     /**
40      *   过滤器注册
41      * @return
42      */
43     @Bean
44     public FilterRegistrationBean timeFilter2() {
45         //加入Filter
46         FilterRegistrationBean registrationBean=new FilterRegistrationBean();
47         TimeFilter2 timeFilter2=new TimeFilter2();
48         registrationBean.setFilter(timeFilter2);
49         //起作用的url
50         List<String> url=new ArrayList<>();
51         url.add("/*");
52         registrationBean.setUrlPatterns(url);
53         //返回
54         return registrationBean;
55 //        return null;
56     }
57 }

  配置类

    因为只有一个Component的注解不能是的拦截器像过滤器一样可以工作

 1 package com.cao.web.interceptor;
 2
 3 import java.util.Date;
 4
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7
 8 import org.springframework.stereotype.Component;
 9 import org.springframework.web.method.HandlerMethod;
10 import org.springframework.web.servlet.HandlerInterceptor;
11 import org.springframework.web.servlet.ModelAndView;
12 //使得成为Spring的组件
13 @Component
14 public class TimeInterceptor implements HandlerInterceptor {
15
16     @Override
17     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
18             throws Exception {
19         System.out.println("preHandle init");
20         //比过滤器的优势,有第三个参数,handler
21         System.out.println("类:"+((HandlerMethod)handler).getBean().getClass().getName());
22         System.out.println("方法:"+((HandlerMethod)handler).getMethod().getName());
23
24         //朝请求里添加属性
25         request.setAttribute("startTime", new Date().getTime());
26         return true;
27     }
28
29     @Override
30     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
31             ModelAndView modelAndView) throws Exception {
32         System.out.println("postHandle init");
33         //处理
34         Long start=(Long)request.getAttribute("startTime");
35         System.out.println("postHandle time interceptor 耗时: "+(new Date().getTime()-start));
36
37     }
38
39     @Override
40     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
41             throws Exception {
42         System.out.println("afterCompletion init");
43     }
44
45 }

  访问效果

  

四:切片

1.问题

  拦截器也有问题,不能拿到方法的具体参数。

  也是spring的核心功能之一,AOP

2.步骤

  

3.添加pom

1 <dependency>
2                 <groupId>org.springframework.boot</groupId>
3             <artifactId>spring-boot-starter-aop</artifactId>
4           </dependency>

4.新建包

  aspect包。

5.程序

  切片

 1 package com.cao.web.aspect;
 2
 3 import java.util.Date;
 4
 5 import org.aspectj.lang.ProceedingJoinPoint;
 6 import org.aspectj.lang.annotation.Around;
 7 import org.aspectj.lang.annotation.Aspect;
 8 import org.springframework.stereotype.Component;
 9
10 //切片
11 @Aspect
12 //成为spring容器的一部分
13 @Component
14 public class TimeAcpect {
15     @Around("execution(* com.cao.web.controller.UserController.*(..))")
16     public Object handleControlledrMethod(ProceedingJoinPoint pjp) throws Throwable {
17         System.out.println("time aspect start");
18         Object[] args=pjp.getArgs();
19         for(Object arg : args) {
20             System.out.println("args is "+arg);
21         }
22         //
23         long start=new Date().getTime();
24         Object object=pjp.proceed();
25         System.out.println("time aspect 耗时: "+(new Date().getTime()-start));
26         //
27         System.out.println("time aspect end");
28
29         return object;
30     }
31 }

  控制类

 1 @RequestMapping(value="/user/{id:\\d+}",method=RequestMethod.GET)
 2     @JsonView(User.UserDetailView.class)
 3     @GetMapping(value="/{id:\\d+}")
 4     public User getInfo(@PathVariable(value="id") String idid){
 5         /**
 6          *  演示filter调用
 7          */
 8         System.out.println("进入getInfo服务");
 9
10         System.out.println("idtt="+idid);
11         User user=new User();
12         user.setUsername("tom");
13         return user;
14         /**
15          *  下面的主要是演示Spring booter异常的处理机制,现在先注释掉
16          */
17 //        throw new UserNotExistException(idid);
18
19     }

6.效果

  访问

  

  控制台:

  

五:先后之行顺序

1.顺序

  上完上面的示例,应该没有问题了,这里使用一个图做一个总结。

  具体的文字就不再描述了,不懂的话,可以看上面的控制台效果

  

  

008 RestFul API 拦截器相关推荐

  1. Spring Mvc 数据回显、异常处理、文件上传、json交互、ResTful、拦截器的使用(高级三)

    1,数据回显 SpringMvc包含三种数据回显机制 第一种:对于简单数据类型,如:Integer.String.Float等使用Model将传入的参数再放到request域实现显示. (回顾jsp四 ...

  2. 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理

    一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响 ...

  3. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展

    1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...

  4. cxf添加拦截器_在CXF API和拦截器中添加Gzip压缩

    cxf添加拦截器 如今,由于我们在响应中发送大量数据,因此必须对API响应执行Gziping. 它节省了网络带宽和交付时间,当然还节省了Internet上的空间. CXF提供了以多种方式使用Gzip压 ...

  5. 在CXF API和拦截器中添加Gzip压缩

    如今,由于我们在响应中发送大量数据,因此必须对API响应执行Gzip压缩. 它节省了网络带宽和交付时间,当然还节省了Internet上的空间. CXF提供了以多种方式使用Gzip压缩的选项. 蓝图 注 ...

  6. JWT的API鉴权,基于拦截器的token与鉴权

    基于JWT的API鉴权 基于拦截器的token与鉴权 如果我们每个方法都去写一段代码,冗余度太高,不利于维护,那如何做使我们的代码看起来更清爽呢?我们可以  将这段代码放入拦截器去实现 Spring中 ...

  7. JAVAWEB开发之SpringMVC详解(二)——高级开发、数据回显、参数绑定集合、图片上传、json交互、validation校验、异常处理、RESTful支持、拦截器

    知识回顾 springmvc框架 用户请求url到DispatcherServlet前端控制器,相当于中央调度器,降低系统各组件之间的耦合度. DispatcherServlet前端控制器通过Hand ...

  8. Resultful API的拦截(拦截器——Interceptor)

    目录 一.Resultful API的拦截三种方式 二.拦截器(Interceptor)的演示示例(springboot项目) 三.Interceptor拦截器特点 四.Filter过滤器.Inter ...

  9. SpringBoot使用拦截器实现Restful URL权限拦截

    前言 RBAC 是基于角色的访问控制(Role-Based Access Control ).权限管理是在任何一个系统里都无法绕过的问题.没有权限控制管理的系统是非常不安全的. 在Spring框架体系 ...

最新文章

  1. k means聚类算法_一文读懂K-means聚类算法
  2. 人工智能实践:TensorFlow笔记学习(五)—— 全连接网络基础
  3. 喜欢 Netflix 么?你应该感谢 FreeBSD
  4. 第二章:Android系统与嵌入式开发读书笔记
  5. Linux 下文件打包和压缩
  6. pytorch 三角函数
  7. Zabbix 集成 OneAlert 实现全方位告警
  8. 什么是堆和栈以及区别详解
  9. 【Linux】tcp缓冲区大小的默认值、最大值
  10. mac catalina删除系统多余文件 内存不足_macOS Catalina Patcher(如何在旧mac上安装Catalina系统)...
  11. 多用继承 android,Android温习之路之继承
  12. lambda函数 RUNOOB python练习题49
  13. react学习(9)----react生命周期
  14. RocketMQ 主从同步机制
  15. 64位ubuntu能安装mysql数据库_Ubuntu操作系统下安装MySQL数据库的方法
  16. 如何在论坛里提高自己的从业水平
  17. MySQL数据库入门学习 #CSDN博文精选# #IT技术# #数据库# #MySQL#
  18. 美国MAK Technoligies介绍
  19. ipad显示已停用,连接itunes
  20. [图论] 平面图 平面性的判定

热门文章

  1. GDCM:获取dicom文件Sequence的长度的测试程序
  2. boost::core::has_single_bit的测试
  3. Boost::context模块callcc的stack测试程序
  4. ITK:计算矢量图像的梯度
  5. VTK:小部件之ImplicitPlaneWidget2
  6. VTK:Medical之MedicalDemo4
  7. OpenCV非真实感渲染的实例(附完整代码)
  8. 使用上下文属性将C ++对象嵌入QML
  9. c++原型模式prototype
  10. python数据库教程_Python连接mysql数据库及简单增删改查操作示例代码