SpringBoot配置过滤器和拦截器
一、概念
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配置过滤器和拦截器相关推荐
- springboot _配置过滤器、拦截器、使用原生servlet
配置过滤器.拦截器.使用原生servlet 过滤器和拦截器的根本区别 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器. 拦截器属于S ...
- SpringBoot实现过滤器、拦截器与切片
作者:七印miss juejin.im/post/5c6901206fb9a049af6dcdcf Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤 ...
- SpringBoot实现过滤器、拦截器与切片源码分析
过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...
- SpringBoot整合过滤器、拦截器
目录 过滤器.拦截器的区别 过滤器.拦截器的使用场景 同时存在过滤器.拦截器时的执行流程 springboot整合过滤器 编写过滤器 配置过滤器 springboot整合拦截器 编写拦截器 配置拦截器 ...
- springBoot之过滤器和拦截器的使用
在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...
- 【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型
文章目录 过滤器 使用过滤器实现访问控制 拦截器 事件驱动模型 过滤器 在实际的开发过程中,可能会遇到这样一类需求:统计在线用户.敏感词过滤或者基于URL进行访问控制.这些需求有一个共同点--在每个接 ...
- springboot配置监听器、过滤器和拦截器
监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...
- springBoot 2.x过滤器--监听器--拦截器
springboot 2.x过滤器 1.什么是 springboot 2.x过滤器 类似于检票员,检验游客的门票 2.springboot里的过滤器 ApplicationContextHeaderF ...
- Springboot项目Aop、拦截器、过滤器横向对比
前言 伟人曾经说过,没有调查就没有发言权(好像是伟人说的,不管谁说的,这句话是正确的),有些东西看着简单,张口就来,但很有可能是错的.我个人的经验是,aop.过滤器.拦截器的实现方式很简单,一学就会, ...
最新文章
- MySQL 学习笔记(10)—— 联结表
- Toronto-3D:用于城市道路语义分割的大规模移动激光雷达数据集
- 2021年人工神经网络第四次作业-第四题:旋转的数字
- 机器学习实战:支持向量机
- 阿里P8架构师整理的架构图你看过吗
- mysql录入foreigen错误_编译安装MySQL5.6失败的相关问题解决方案
- 划重点:微信小程序1月9日正式上线
- 我的MVVM框架 v0.1发布
- 旅行线路定制主题响应式手机模板
- Java共享字符串_JAVA-字符串的构建
- 泛型与继承的关系,通配符
- golang flag
- 解决电脑关机后自动重启问题
- 百度关闭快照删除更新入口
- 10019---Linux查看CPU、内存、硬盘、版本信息
- 纸壳CMS 3.0升级.Net Core 2.1性能大提升
- Recommended software
- 未来杯区域赛奖项争夺进入倒计时,专家评审团阵容揭晓
- Centos桌面版无法打开Chrome浏览器
- matlab仿真高尔顿正态分布源码,中心极限定理:从高尔顿板到麦克斯韦分布