详谈springboot过滤器和 * 的实现及区别

作者:tom和cat 时间:2022-07-22 04:44:24 

前言

springmvc中有两种很普遍的AOP实现:

1.过滤器(Filter)

2. * (Interceptor)

本篇面对的是一些刚接触springboot的人群

所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别

(一些复杂的功能我会之后发出文章,请记得关注)

Filter的简单实现

字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url

那么它能帮我们过滤什么呢?

那功能可就多了:

比如过拦截掉我们不需要的接口请求

修改请求(request)和响应(response)内容

完成CORS跨域请求等等

现在我们来实现一个简单的过滤器:

可以新建一个filter包,随着项目的扩大过滤器会越来越多

在这里我新建了一个TestFilter类,实现Filter接口


@Component
@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")
public class TestFilter implements Filter{}

我们一步步来

1.@Component就是把这个类注入到IOC容器中

2.@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")说明这是一个web过滤器,它拦截的url为/Blogs,过滤器名字为blogsTest

下面贴出实现接口之后的三个重构方法:


@Override
 public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   HttpServletRequest request= (HttpServletRequest) servletRequest;
   HttpServletResponse response = (HttpServletResponse) servletResponse;
   System.out.printf("过滤器实现");
   filterChain.doFilter(request,response);
 }

@Override
 public void destroy() {

}

初始化(init)和摧毁(destroy)方法一般不会用到,具体使用看下源码便知

doFilter()是过滤器的核心

注意:在实现接口方法之后,我们要转换request和response类型至HttpServlet,否则接下去的操作可能会报错。

如果过滤通过,执行filterChain.doFilter(request,response);

说明这个url已经经过了我们的Filter

可以看到,只需要一个类我们就实现了一个简单的过滤器

当然可以不用注解的方式,配置启动类


//过滤器
 @Bean
 public FilterRegistrationBean filterRegistrationBean(){
   FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
   List<String> urlPatterns = new ArrayList<String>();

TestFilter testFilter = new TestFilter();  //new过滤器
   urlPatterns.add("/Blogs");   //指定需要过滤的url
   filterRegistrationBean.setFilter(testFilter);    //set
   filterRegistrationBean.setUrlPatterns(urlPatterns);   //set

return filterRegistrationBean;
 }

这也是可以的,本人其实还是比较推荐这种方式添加过滤器

Interceptor的简单实现

* 的实现比过滤器稍微复杂一点

我们同样可以新建一个interceptor包

在里面新建一个名为MyInterceptor的类


public class MyInterceptor implements HandlerInterceptor {}

这个类实现了HandleInterceptor接口

直接贴类代码,我会在代码中注释功能


public class MyInterceptor implements HandlerInterceptor {
 //在请求处理之前进行调用(Controller方法调用之前
 @Override
 public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
   System.out.printf("preHandle被调用");
   return true;  //如果false,停止流程,api被拦截
 }

//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
 @Override
 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
   System.out.println("postHandle被调用");
 }

//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
 @Override
 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
   System.out.println("afterCompletion被调用");
 }
}

它依次实现了三个方法

相比过滤器, * 还需要在springmvc中注入

所以我们打开启动类,写入以下代码


public class WarApplication {

public static void main(String[] args) {
   SpringApplication.run(WarApplication.class, args);
 }

//mvc控制器
 //@Configuration
 static class WebMvcConfigurer extends WebMvcConfigurerAdapter{
   //增加 *
   public void addInterceptors(InterceptorRegistry registry){
     registry.addInterceptor(new MyInterceptor())  //指定 * 类
         .addPathPatterns("/Handles");    //指定该类拦截的url
   }
 }
}

这里我在/Handles这个url中进行拦截

代码写完了,来看下结果

当进入指定url时,我们执行到了 *

接下来就可以根据需求去使用 * 了

区别

过滤器和 * 非常相似,但是它们有很大的区别

最简单明了的区别就是过滤器可以修改request,而 * 不能

过滤器需要在servlet容器中实现, * 可以适用于javaEE,javaSE等各种环境

* 可以调用IOC容器中的各种依赖,而过滤器不能

过滤器只能在请求的前后使用,而 * 可以详细到每个方法

区别很多,大家可以去查下

总的来说

过滤器就是筛选出你要的东西,比如requeset中你要的那部分

* 在做安全方面用的比较多,比如终止一些流程

来源:https://blog.csdn.net/sinat_32023305/article/details/79926588

标签:springboot,过滤器, ,
0
投稿

猜你喜欢

  • Android编程实现WebView添加进度条的方法

    2023-07-06 03:16:46
  • springmvc和js前端的数据传递和接收方式(两种)

    2021-06-15 08:33:37
  • c#与WMI使用技巧集第1/2页

    2022-03-16 05:16:01
  • Java多种经典排序算法(含动态图)

    2023-09-24 00:45:02
  • springboot对接支付宝支付接口(详细开发步骤总结)

    2023-11-10 23:07:35
  • java 利用反射获取内部类静态成员变量的值操作

    2023-03-28 21:30:04
  • Java中静态类型检查是如何进行的实例思路详解

    2022-01-01 16:08:30
  • Java Spring @Lazy延迟注入源码案例详解

    2023-06-24 05:21:07
  • 学生信息管理系统java版

    2023-06-16 15:48:10
  • Java Spring 事件监听详情解析

    2021-06-05 00:02:08
  • C#调用dll报错:无法加载dll,找不到指定模块的解决

    2023-08-23 23:36:12
  • Java详解实现多线程的四种方式总结

    2023-04-04 19:43:34
  • java实现死锁的示例代码

    2023-10-12 18:12:40
  • 使用Spring组合自定义的注释 mscharhag操作

    2023-02-14 11:18:01
  • 探究Java常量本质及三种常量池(小结)

    2023-06-17 10:28:17
  • 引入mybatis-plus报 Invalid bound statement错误问题的解决方法

    2021-06-01 14:28:00
  • Java语法基础之运算符学习笔记分享

    2021-12-18 02:13:17
  • logback关闭某个包的日志操作

    2023-04-12 20:16:57
  • C#实现加密的几种方法介绍

    2022-12-12 22:38:00
  • 浅谈java的接口和C++虚类的相同和不同之处

    2023-08-05 12:01:51
  • asp之家 软件编程 m.aspxhome.com