Java Restful API的拦截详解

网友投稿 377 2022-09-29


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类中的方法)调用之前调用

@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 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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据安全被篡改的风险分析解决方案(数据安全问题怎么解决)
下一篇:网站程序代码存在漏洞如何挖掘和修复(网站漏洞利用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~