详谈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


猜你喜欢
- c# chart缩放,局部放大效果:左键划选放大区域,右键恢复 /// <sum
- 这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找开始正文1、先介绍本文会用到的window
- 今天在工作中突然遇到这个问题,开始郁闷得不行,查阅了很多资料才解决。话不多少先上图①解决连接超时问题1:在Linux下输入命令ifconfi
- 1、什么是委托从数据结构来讲,委托是和类一样是一种用户自定义类型。委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。
- 实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法。filterType():定义过滤器的类型,它有4
- 生活中随处可见并行的例子,并行 顾名思义就是一起进行的意思,同样的程序在某些时候也需要并行来提高效率,在上一篇文章中我们了解了 Java 语
- 本文实例为大家分享了Android实现长截屏功能的具体代码,供大家参考,具体内容如下1、MainActivitypublic class M
- public static string EncryptWithMD5(string source) &n
- 多亏了<include />标签,在Android里,很容易就能做到共享和重用UI组件。在Android开发中,很容易就能创建出
- 项目描述:这是一个基于SpringBoot+Vue框架开发的仿小米电子产品售卖商城系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说
- 一、创建字符串创建字符串的方式有很多种,当是常见的一般就三种1. 直接赋值(常用)String str = "hello worl
- 那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
- mybatis group by substr传参报错报异常### Cause: java.sql.SQLSyntaxErrorExcept
- BigDecimal除法精度和格式化输出import java.math.BigDecimal;import java.math.MathC
- 又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了)。这次我们来谈一谈Java里的一个很有意思的东西——回调。什么叫回
- 真正的帮助大家理解红黑树:一、红黑树所处数据结构的位置:在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储红黑
- tcp一般用于维持一个可信任的连接,比起udp更为安全可靠,在vs.net,分别有tcpclient和udpclient以及tcpliste
- 为什么需要网关呢?我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做
- 一、概述一个Process组件提供了在计算机运行进程的访问权限。 进程,在最简单的术语中,是正在运行的应用。提供对本地和远程进程的访问权限并
- 效果图,每隔1秒,变换一下时间 xml: <RelativeLayout xmlns:android="http