Java Restful API的拦截详解
一、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类中的方法)调用之前调用
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Time Filter init");
}
//在控制器方法(即controller类中的方法)调用之后调用
@Override
public 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类中的方法)调用之后调用
@Override
public void destroy() {
System.out.println("Time Filter destroy");
}
}
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;
@Configuration
public class WebFilterConfig {
@Bean
public FilterRegistrationBean timeFilter(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new TimeFilter());
ArrayList<String> list = new ArrayList<>();
list.add("/*");//过滤所有路径
filterRegistrationBean.setUrlPatterns(list);
return filterRegistrationBean;
}
}
3、自定义一个控制类,代码如下
@RestController//表示此Controller提供RestAPI
public class SysQueryController {
/**
* @RequestMapping 映射http请求url到java方法
* @RequestParam 映射请求参数到java方法的参数
*/
@RequestMapping(value = "/user1",method = RequestMethod.GET)
public void query1(@RequestParam String username){
System.out.println("query1====="+username);
}
}
4、测试步骤
- 启动项目时会先输出自定义过滤器类TimeFilter的init方式的信息,如下图:

- 再用postman测试工具发送请求,如下图:

- 最后查看控制态输出信息,如下图:
//输出内容 Time Filter start query1=====xz Filter耗时:128 Time Filter end

5、输出第4步的内容表示自定义的Filter过滤器成功。
三、Filter过滤器特点
由上面的示例可知:Filter过滤器可以获取到原始的http请求和响应的信息,但是获取不到真正处理请求的方法信息。
四、Filter过滤器、Interceptor拦截器 、Aspect切面起作用的顺序
- 先是Filter过滤器起作用
- 然后Interceptor拦截器起作用
- 然后Aspect切面起作用
- 最后进入Controller方法中
五、当控制层(即Controller层)的方法抛异常时,Filter过滤器、Interceptor拦截器 、Aspect切面 抛异常的顺序
- 先是Aspect切面
- 如果使用@ControllerAdvice自定义异常,再进入这个处理异常类
- 然后Interceptor拦截器
- 然后Filter过滤器
- 如果都没处理,最后到tomcat
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
相关文章
SpringCloud服务实现同时使用eureka和nacos方法
这篇文章主要介绍了SpringCloud服务实现同时使用eureka和nacos方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧2023-01-01
springboot项目中controller层与前端的参数传递方式
这篇文章主要介绍了springboot项目中controller层与前端的参数传递方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-10-10
Mybatis collection查询集合属性报错的解决方案
这篇文章主要介绍了Mybatis collection查询集合属性报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09
Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法
这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-12-12
SpringBoot整合mybatisplus和druid的示例详解
这篇文章主要介绍了SpringBoot整合mybatisplus和druid的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-08-08


最新评论