一、概念

1简介

过滤器是JavaEE中Servlet规范的一个组件,通过Filter技术,可以实现用户访问某个资源前,对访问的请求和响应进行拦截

拦截器(Interceptor)类似于Servlet中的过滤器,主要用于拦截客户请求并做出相应的处理。

2 原理

过滤器在实现上基于函数回调,可以对几乎所有的请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要的数据。比如,在过滤器中修改字符编码,在过滤器中修改HttpServletRequest的一些参数。包括:过滤低俗文字,危险字符等。

拦截器是基于java的反射机制的

调用顺序:Filter>Interceptor>Aspect>Controller

当Controller抛出异常时,处理顺序是由内到外的。因此,经常定义一个@ControllerAdvice去统一处理控制器抛出的异常。一旦异常被@ControllerAdvice处理了,则调用拦截器的afterCompletion方法的参数Exception ex就为空了

3.区别

1.过滤器只能在容器初始化时被调用一次,在action的生命周期中,而拦截器可以多次被调用。
2.过滤器可以对几乎所有的请求起作用,拦截器只能对action请求起作用。
3.过滤器不能访问action上下文、值栈里的对象,而拦截器可以访问。
4.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
5.过滤器是基于函数回调,而拦截器是基于java的反射机制的。
6.过滤器不能获取IOC容器中的各个bean,而拦截器可以,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

二、配置

1.过滤器配置

1.1 注解配置

package com.example.springbootmaven.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebFilter(filterName="filter01",urlPatterns={"/*"})
@Component
@Order(1)
public class ThreadNameFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("start");System.out.println(servletRequest.getClass());HttpServletResponse response = (HttpServletResponse) servletResponse;response.setStatus(200);response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print("msg:"+request.getRequestURI());System.out.println("end");}
}

注意:

@WebFilter表明此类为过滤器,filterName为过滤器名称,urlPatterns为过滤路径

@Order为过滤器过滤顺序,数字越小,越先被过滤

@Component声明为bean,被容器扫描加载

1.2 Java配置

package com.example.springbootmaven.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ThreadNameFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("start");System.out.println(servletRequest.getClass());HttpServletResponse response = (HttpServletResponse) servletResponse;response.setStatus(200);response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print("msg:"+request.getRequestURI());System.out.println("end");}
}
package com.example.springbootmaven.config;import com.example.springbootmaven.filter.ThreadNameFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/***/
@Configuration
public class BaseFilterConfig {/*** @返回值 org.springframework.boot.web.servlet.FilterRegistrationBean*/@Beanpublic FilterRegistrationBean registFilter() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new ThreadNameFilter());registration.addUrlPatterns("/getName");registration.setName("thread");registration.setOrder(Integer.MIN_VALUE);return registration;}
}

注意:这种方式每声明一个过滤器,就要在配置类中创建一个 FilterRegistrationBean,以配置其名称、路径、顺序等

2.拦截器配置

package com.kaishengit.config;import com.kaishengit.entity.Account;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor extends HandlerInterceptorAdapter {//请求拦截@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();Account account = (Account)session.getAttribute("account");//未登录,跳转登录页if (account==null){String redirectPath = "/login";response.sendRedirect(redirectPath);return false;}return true;}//响应拦截@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {super.postHandle(request, response, handler, modelAndView);}//视图渲染完成之后拦截@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {super.afterCompletion(request, response, handler, ex);}
}
package com.kaishengit.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CustomerWebMvcConfigurer implements WebMvcConfigurer {/** 设置拦截器需要拦截的路径* mvc路径拦截* 静态资源不拦截* */@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");}}

SpringBoot配置过滤器和拦截器相关推荐

  1. springboot _配置过滤器、拦截器、使用原生servlet

    配置过滤器.拦截器.使用原生servlet 过滤器和拦截器的根本区别 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器. 拦截器属于S ...

  2. SpringBoot实现过滤器、拦截器与切片

    作者:七印miss juejin.im/post/5c6901206fb9a049af6dcdcf Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤 ...

  3. SpringBoot实现过滤器、拦截器与切片源码分析

    过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...

  4. SpringBoot整合过滤器、拦截器

    目录 过滤器.拦截器的区别 过滤器.拦截器的使用场景 同时存在过滤器.拦截器时的执行流程 springboot整合过滤器 编写过滤器 配置过滤器 springboot整合拦截器 编写拦截器 配置拦截器 ...

  5. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  6. 【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型

    文章目录 过滤器 使用过滤器实现访问控制 拦截器 事件驱动模型 过滤器 在实际的开发过程中,可能会遇到这样一类需求:统计在线用户.敏感词过滤或者基于URL进行访问控制.这些需求有一个共同点--在每个接 ...

  7. springboot配置监听器、过滤器和拦截器

    监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...

  8. springBoot 2.x过滤器--监听器--拦截器

    springboot 2.x过滤器 1.什么是 springboot 2.x过滤器 类似于检票员,检验游客的门票 2.springboot里的过滤器 ApplicationContextHeaderF ...

  9. Springboot项目Aop、拦截器、过滤器横向对比

    前言 伟人曾经说过,没有调查就没有发言权(好像是伟人说的,不管谁说的,这句话是正确的),有些东西看着简单,张口就来,但很有可能是错的.我个人的经验是,aop.过滤器.拦截器的实现方式很简单,一学就会, ...

最新文章

  1. MySQL 学习笔记(10)—— 联结表
  2. Toronto-3D:用于城市道路语义分割的大规模移动激光雷达数据集
  3. 2021年人工神经网络第四次作业-第四题:旋转的数字
  4. 机器学习实战:支持向量机
  5. 阿里P8架构师整理的架构图你看过吗
  6. mysql录入foreigen错误_编译安装MySQL5.6失败的相关问题解决方案
  7. 划重点:微信小程序1月9日正式上线
  8. 我的MVVM框架 v0.1发布
  9. 旅行线路定制主题响应式手机模板
  10. Java共享字符串_JAVA-字符串的构建
  11. 泛型与继承的关系,通配符
  12. golang flag
  13. 解决电脑关机后自动重启问题
  14. 百度关闭快照删除更新入口
  15. 10019---Linux查看CPU、内存、硬盘、版本信息
  16. 纸壳CMS 3.0升级.Net Core 2.1性能大提升
  17. Recommended software
  18. 未来杯区域赛奖项争夺进入倒计时,专家评审团阵容揭晓
  19. Centos桌面版无法打开Chrome浏览器
  20. matlab仿真高尔顿正态分布源码,中心极限定理:从高尔顿板到麦克斯韦分布

热门文章

  1. tomcat-添加操作日志
  2. 新媒体运营的岗位晋升路线是怎么样的? 新媒体管理师是趋势吗?
  3. idea创建分支、合并分支、解决分支冲突
  4. Matlab各历史版本
  5. 嵌入式实操----基于RT1170 首板硬件之EEPROM AT24C16调试(十五)
  6. 从少量访问日志还原黑客攻击过程
  7. 【JavaSE】----- Java语言的介绍
  8. 解决win10下栏不显示电池电量图标问题
  9. MySQL数据库实际应用中,需求分析阶段需要做什么?
  10. 嵌入式主板有哪些特点?