您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Resultful API的拦截(过滤器——Filter)

小志的博客 发布时间:2021-09-05 21:46:33 ,浏览量:0

这里写目录标题
    • 一、Resultful API的拦截三种方式
    • 二、过滤器(Filter)的演示示例(springboot项目)
    • 三、Filter过滤器特点
    • 四、Filter过滤器、Interceptor拦截器 、Aspect切面起作用的顺序
    • 五、当控制层(即Controller层)的方法抛异常时,Filter过滤器、Interceptor拦截器 、Aspect切面 抛异常的顺序

一、Resultful 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
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0403s