资讯专栏INFORMATION COLUMN

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

ckllj / 2993人阅读

摘要:四过滤器拦截器切面起作用的顺序先是过滤器起作用然后拦截器起作用然后切面起作用最后进入方法中五当控制层即层的方法抛异常时,过滤器拦截器切面抛异常的顺序先是切面如果使用自定义异常再进入这个处理异常类然后拦截器然后过滤器如果都没处理,最后到

一、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;@Configurationpublic 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提供RestAPIpublic 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 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119348.html

相关文章

  • Resultful API拦截(切片Aspect)

    摘要:目录一的拦截三种方式二切片的演示示例项目三切片特点四过滤器拦截器切面起作用的顺序五当控制层即层的方法抛异常时,过滤器拦截器切面抛异常的顺序一的拦截三种方式过滤器拦截器切片二切片的演示示例项目自定义一个名称为的切片,代码 ...

    huaixiaoz 评论0 收藏0
  • springboot(五)——springboot中拦截器和滤器小结

    摘要:而拦截器代理模式的实现基于反射,代理又分静态代理和动态代理,动态代理是拦截器的简单实现。如果是处理前后,既可以使用拦截器也可以使用过滤器,如果都使用了,注意前后顺序。 前言 关于过滤器Filter和拦截器Interceptor,大家都不会陌生,从一开始的servelet,到springmvc,再到现在的springboot,都有接触到,记得刚接触的时候,会容易弄混淆,想写这篇文章做个小...

    Magicer 评论0 收藏0
  • spring中滤器拦截区别

    摘要:拦截器原理拦截器是基于反射机制动态代理实现使用实现接口返回值表示是否需要将当前的请求拦截下来。 拦截器 原理:拦截器是基于java反射机制(动态代理)实现 使用: 实现HandlerInterceptor接口 - preHandle:返回值:boolean表示是否需要将当前的请求拦截下来。方法中Object对象标识的是被拦截的请求的目标对象 - postHandle:在Disp...

    gotham 评论0 收藏0
  • 调用链系列(3):如何从零开始捕获body和header

    摘要:拓展阅读调用链系列解读中的贪吃蛇调用链系列轻调用链实现在中,协议的请求响应模型是由规范容器如实现的。在这篇文章中,我会向大家具体介绍如何从零开始捕获和。配置以后,我们就可以从的方法中获取到和后文简称和了。三获取和获取的方式大体相同。 拓展阅读:调用链系列(1):解读UAVStack中的贪吃蛇 调用链系列(2):轻调用链实现 在Java中,HTTP协议的请求/响应模型是由Servlet规...

    hqman 评论0 收藏0
  • 【Geek议题】合理VueSPA架构讨论(下)

    摘要:接上篇议题合理的架构讨论上传送门。处理思路如下使用上面定义的方法获取如果能获取到则说明有有效的,则时候即可跳转到目标页如果获取到空字符串,则说明无效或不存在,跳转至登录页面。 接上篇《【Geek议题】合理的VueSPA架构讨论(上)》传送门。 自动化维护登录状态 登录状态标识符跟token类似,都是需要自动维护有效期,但也有些许不同,获取过程只在用户登录或注册的时候,不需要自动获取。 ...

    mindwind 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<