Springboot 过滤器
admin
2024-02-26 23:32:56
0

拦截器和过滤器的区别:

过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象


1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。



最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

一、应用场景:

Springboot的过滤器,在web开发中可以过滤指定的url
比如过拦截掉我们不需要的接口请求,同时也可以修改request和response内容
过滤器的应用场景:
1)过滤敏感词汇(防止sql注入)
2)设置字符编码
3)URL级别的权限访问控制
4)压缩响应信息

二、实现方法:

 1、使用spring boot提供的FilterRegistrationBean注册Filter 
2、使用原生servlet注解定义Filter 
两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

 方式一: (使用spring boot提供的FilterRegistrationBean注册Filter )

①、先定义Filter:

 
package com.corwien.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
Logger logger = LoggerFactory.getLogger(BaseFilter.class);static final String TOKEN = "20220423344556abac";//内部接口集合public static List INSIDE_URLS = Lists.newArrayList("/index","/inside");//白名单接口集合public static List WHITE_PATH = Lists.newArrayList("/white","/login");@Override public void init(FilterConfig filterConfig) throws ServletException {}@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 处理request 或response// doFilter()方法中的servletRequest参数的类型是ServletRequest,需要转换为HttpServletRequest类型方便调用某些方法System.out.println("filter1"); // 调用filter链中的下一个filterHttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String ip = request.getRemoteAddr();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = new Date();String date = sdf.format(d);System.out.printf("%s %s 访问了 %s%n", date, ip, url);String requestURI = request.getRequestURI();if(INSIDE_URLS.contains(requestURI)){//内部接口,直接通过filterChain.doFilter(servletRequest,servletResponse);return;}if(WHITE_PATH.contains(requestURI)){//白名单接口,直接通过filterChain.doFilter(servletRequest,servletResponse);return;}//进行校验,如token校验String token = request.getHeader("token");if(TOKEN.equals(token)){filterChain.doFilter(servletRequest,servletResponse);}else {//token校验不通过,重定向到登录页面wrapper.sendRedirect("/login");}}@Override public void destroy() {}
}

过滤器需要实现Filter类,其中有三个默认的方法(init初始方法,doFilter核心过滤方法,destroy销毁方法) 

②、注册自定义Filter过滤器配置类

@Configuration
public class FilterConfig {/*** 基础过滤器* @return*/@Beanpublic FilterRegistrationBean baseFilter(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new BaseFilter());filterRegistrationBean.setUrlPatterns(Lists.newArrayList("/*"));filterRegistrationBean.setOrder(1);return filterRegistrationBean;}
}

新增controller方法和登录页login.html


@RestController
public class restController {@Autowiredprivate AsynService asynService;/*** 白名单接口* @return*/@GetMapping("/while")public String whileTest(){return "success";}/*** 非白名单接口* @return*/@GetMapping("/no-while")public String noWhileTest(){return "success";}/*** 登录接口* @param username* @param password* @param mv* @param request* @param model* @return*/@GetMapping("/login")public ModelAndView login(String username, String password, ModelAndView mv, HttpServletRequest request, Model model){if(StringUtils.hasLength(username)&&StringUtils.hasLength(password)){//TODO 登录逻辑System.out.println("成功!!");mv.setViewName("index");}else{System.out.println("失败!!");mv.setViewName("/login.html");}return mv;}
}

测试

项目启动后,访问下面两个接口(白名单接口PK非白名单接口)
接口一:http://localhost:8080/whileTest
接口二:http://localhost:8080/no-while

接口一为白名单范畴,过滤器直接通行,返回“success”

接口二在过滤器中需要校验token,在没有携带token的情况下,会重定向到登录页

相关内容

热门资讯

供需升级点燃暑期文旅,亲子游火... 文|极光月狐数据研究院 全国文旅市场持续复苏与升温,6月10日高考结束后的毕业游拉开暑期档序幕,预...
20世纪福克斯动画作品 20世纪福克斯动画作品 1.《辛普森一家》是美国福克斯广播公司出品的一部动画情景喜剧,由马特·格...
去恩施旅游5天4晚不踩雷路线推... 我们之前去恩施旅游五天四晚,当时是听了朋友的介绍,找了个当地口碑很好的本地向导丽丽给我们规划五天的行...
现在涞源县走马驿镇燕窝村有水电... 现在涞源县走马驿镇燕窝村有水电吗有。根据查询记录涞源显示,根据查询记录涞源显示,截止到2023年8月...
出境游打车更方便了:Uber上... 2025年7月21日,全球即时用车平台Uber优步打车正式上线官方微信小程序,方便中国游客通过微信在...
三言两拍中那部著作收录了南橘北... 三言两拍中那部著作收录了南橘北枳的故事吗是的,收录在以下作品:《喻世明言》,白话短篇小说集,初刻用名...
Disney迪士尼验厂指南,各... Disney迪士尼验厂标准的总体要求是:所有生产迪士尼品牌产品的工厂,必须通过迪士尼的ILS全球劳工...
求几部好看的地球人大战外星人的... 求几部好看的地球人大战外星人的电影星河战队,黑衣人,独立日,洛杉矶之战,火星人玩转地球,超级战舰,第...
安徽3天2夜游超全攻略,黄山3... 黄山,这座被誉为“天下第一奇山”的名山,以其奇松、怪石、云海、温泉四绝闻名于世。一直以来,它都是我心...
暑假去黄山旅游五天四晚花多少钱... 黄山,这座被誉为“天下第一奇山”的名山,以其奇松、怪石、云海、温泉四绝闻名于世。一直以来,它都是我心...
古典仙侠是什么意思、 古典仙侠是什么意思、就是涉及到古代传说、神话的小说。比如:凡人修仙传,仙逆就不涉及。
和爸妈去贵州旅游3天多少钱?贵... 贵州,一个充满神秘与魅力的地方,以其独特的喀斯特地貌、丰富的民族文化以及诱人的美食而闻名遐迩。一直听...
今天是个好日子 今天是个好日子嗯 确实是呢!唉 开心的锣鼓敲出年年的喜庆 好看的舞蹈送来天一原欢腾 阳光的油彩涂红...
和姐妹去黄山玩3天花多少钱?安... 黄山,作为中国著名的风景名胜区,以其奇松、怪石、云海、温泉四绝闻名于世,一直是众多游客向往的旅游胜地...
爸爸姓罗妈妈姓余 女孩名字 爸爸姓罗妈妈姓余 女孩名字爸爸姓罗妈妈姓余 女孩名字罗婕余。婕有美好的意思,有官职的意思煜祺 ...
你若安好的介绍 你若安好的介绍《你若安好》编辑推荐:2012年首一部唯美浪漫文字电影,将所有的感动镌刻在纸页间,在我...
老人淌眼泪是怎么回事 老人淌眼泪是怎么回事最近2.3天老流泪,也不疼也不痒,这是怎么回事您好,请问您的家人除了溢泪的症状是...
“地”字开头的成语 “地”字开头的成语地开头成语(30个):地久天长、地大物博、地主之谊、地灵人杰、地老天荒、地动山摇、...
为什么我玩日服fgo老出现这 为什么我玩日服fgo老出现这我想知道怎么玩日服上面写着正在减压,请等待。。。
失道者寡助得道者多助翻译 失道者寡助得道者多助翻译不要一大堆蓝七八糟的,我要最准确最简单明了解释。站在正义方面,会得到多数人的...