SpringBoot 过滤器 Filter使用实例详解

作者:后端Q 时间:2021-11-08 13:46:00 

简介

过滤器是AOP(面向切面编程)思想的具体实现。可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。

在浏览器对服务器发起请求或者服务器对浏览器响应,都会经过过滤器。

基于过滤器的机制,我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验有没有Session,实现URL级别的权限控制、压缩响应信息、编码格式等。

用法

在spring的应用中我们存在两种过滤的用法,一种是 * 、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。

功能

filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

实现

Filter的执行由Servlet容器回调完成,因此我们不需要再额外引包。

新建MyFilter类

@Slf4j
@Order(1)
@WebFilter(filterName = "myFilter", urlPatterns = {"/user/*"})
public class MyFilter implements Filter {
   @Autowired
   private SysUserService sysUserService;
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
       log.info("过滤器初始化");
   }
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       log.info("请求处理");
       HttpServletResponse response = (HttpServletResponse) servletResponse;
       HttpServletRequest request = (HttpServletRequest) servletRequest;
       log.info("MyFilter, URL:{}", request.getRequestURI());
       if (request.getRequestURI().contains("login")) {
           filterChain.doFilter(servletRequest, servletResponse);
       } else {
           log.info("非法URL:{}", request.getRequestURI());
           response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
           PrintWriter writer = response.getWriter();
           writer.print("no access");
       }
   }
   @Override
   public void destroy() {
       log.info("过滤器销毁");
   }
}

用@WebFilter注解,指定拦截路径以及一些参数,同时需要在启动类使用@ServletComponentScan扫描带@WebFilter、@WebServlet、@WebListener并将帮我们注入bean

@ServletComponentScan
@SpringBootApplication
public class DevRootApplication {
   public static void main(String[] args) {
       SpringApplication.run(DevRootApplication.class, args);
   }
}

当有多个过滤器之后,就需要规定各个过滤器的指定顺序了。

使用@Order()注解

来源:https://juejin.cn/post/7151454048959332388

标签:SpringBoot,Filter,过滤器
0
投稿

猜你喜欢

  • Redis 订阅发布_Jedis实现方法

    2023-11-10 03:38:41
  • JAVA JDK8 List分组的实现和用法

    2023-11-26 09:56:11
  • java创建线程的两种方法区别

    2023-11-11 09:17:52
  • java微信公众号开发(搭建本地测试环境)

    2021-07-07 05:32:40
  • 详解Java中HashSet和TreeSet的区别

    2022-01-17 09:47:47
  • JPA如何设置表名和实体名,表字段与实体字段的对应

    2022-07-14 14:36:27
  • java web返回中文乱码问题及解决

    2023-08-25 08:23:08
  • Java技能点之SimpleDateFormat进行日期格式化问题

    2023-09-09 01:50:26
  • Mybatis中 mapper-locations和@MapperScan的作用

    2023-07-13 08:08:34
  • Springboot与vue实现数据导出方法具体介绍

    2023-11-06 21:00:34
  • 浅谈Spring-cloud 之 sleuth 服务链路跟踪

    2022-09-24 16:07:43
  • Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

    2023-08-24 03:49:59
  • 最常用的1000个Java类(附代码示例)

    2023-03-25 20:29:07
  • Java基于Runtime调用外部程序出现阻塞的解决方法

    2023-11-09 04:24:23
  • Java SpringSecurity+JWT实现登录认证

    2022-12-13 16:44:18
  • SpringBoot路径映射实现过程图解

    2023-11-13 04:01:11
  • java 如何计算同比增长工具类

    2023-11-09 08:50:35
  • Java Comparable及Comparator接口区别详解

    2023-07-03 08:19:50
  • C#多线程学习之(三)生产者和消费者用法分析

    2021-08-11 01:55:26
  • Spring Security中使用authorizeRequests遇到的问题小结

    2023-10-07 04:23:45
  • asp之家 软件编程 m.aspxhome.com