Java|Java Restful API的拦截详解
目录
- 一、Restful API的拦截三种方式
- 二、过滤器(Filter)的演示示例(springboot项目)
- 三、Filter过滤器特点
- 四、Filter过滤器、Interceptor拦截器 、Aspect切面起作用的顺序
- 五、当控制层(即Controller层)的方法抛异常时,Filter过滤器、Interceptor拦截器 、Aspect切面 抛异常的顺序
- 总结
一、Restful API的拦截三种方式
- 过滤器(Filter)
- 拦截器(Interceptor)
- 切片(Aspect)
二、过滤器(Filter)的演示示例(springboot项目) 1、自定义一个名称为TimeFilter的过滤器,代码如下:
package com.xz.springsecuritydemo.filter; import org.springframework.stereotype.Component; import javax.servlet.*; import java.io.IOException; import java.util.Date; @Component//添加该注解使过滤器启作用,如果不使用@Component注解需要写配置类,例lz写的WebConfig进行注册public class TimeFilter implements Filter {//在控制器方法(即controller类中的方法)调用之前调用@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Time Filter init"); }//在控制器方法(即controller类中的方法)调用之后调用@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Time Filter start"); long startTime = new Date().getTime(); chain.doFilter(request,response); long endTime = new Date().getTime(); System.out.println("Filter耗时:"+(endTime-startTime)); System.out.println("Time Filter end"); }//在控制器方法(即controller类中的方法)调用之后调用@Overridepublic void destroy() {System.out.println("Time Filter destroy"); }}
【Java|Java Restful API的拦截详解】2、自定义一个WebFilterConfig配置类,步骤1中如果不使用@Component注解,需要使用基于java的配置方式实现,代码如下:
package com.xz.springsecuritydemo.filter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; @Configurationpublic class WebFilterConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(); filterRegistrationBean.setFilter(new TimeFilter()); ArrayList list = new ArrayList<>(); list.add("/*"); //过滤所有路径filterRegistrationBean.setUrlPatterns(list); return filterRegistrationBean; }}
3、自定义一个控制类,代码如下
@RestController//表示此Controller提供RestAPIpublic class SysQueryController {/*** @RequestMapping映射http请求url到java方法* @RequestParam映射请求参数到java方法的参数*/@RequestMapping(value = "https://www.it610.com/user1",method = RequestMethod.GET)public void query1(@RequestParam String username){System.out.println("query1====="+username); } }
4、测试步骤
- 启动项目时会先输出自定义过滤器类TimeFilter的init方式的信息,如下图:
文章图片
- 再用postman测试工具发送请求,如下图:
文章图片
- 最后查看控制态输出信息,如下图:
//输出内容Time Filter startquery1=====xzFilter耗时:128Time Filter end
文章图片
5、输出第4步的内容表示自定义的Filter过滤器成功。
三、Filter过滤器特点 由上面的示例可知:Filter过滤器可以获取到原始的http请求和响应的信息,但是获取不到真正处理请求的方法信息。
四、Filter过滤器、Interceptor拦截器 、Aspect切面起作用的顺序
- 先是Filter过滤器起作用
- 然后Interceptor拦截器起作用
- 然后Aspect切面起作用
- 最后进入Controller方法中
五、当控制层(即Controller层)的方法抛异常时,Filter过滤器、Interceptor拦截器 、Aspect切面 抛异常的顺序
- 先是Aspect切面
- 如果使用@ControllerAdvice自定义异常,再进入这个处理异常类
- 然后Interceptor拦截器
- 然后Filter过滤器
- 如果都没处理,最后到tomcat
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 2020-04-07vue中Axios的封装和API接口的管理
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用