合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
一直想着写一篇关于过滤器和拦截器
,记得之前面试,面试官突然问了一个谈谈过滤器和拦截器的区别。
当时脑瓜子嗡嗡的,这个没准备过,咋办,支支吾吾的说了先到过滤器在到拦截器。
直接被说,你连请求来了经历那些都不知道,怎么能行呢?
虽然这个是八股文,但是还是比较有内容的,在项目中会使用到,在鉴权、日志记录等!
从此之后,面试前第一件事,就是把过滤器和拦截器看一遍。
今天好好总结一下,不需要在看别人写的了!
不能为了面试而学习,咱们是为了掌握好他们,咱们今天从概念--->场景--->实战--->面试题。
一步步层层递进,不让大家白白点开,一定是有所收获!
执行顺序总体图:
过滤器是一种在 Java Web 应用中用于处理请求和响应的组件。它可以拦截客户端发起的请求,也可以拦截服务器返回的响应,对它们进行处理或者修改。
过滤器属于Servlet规范的一部分,过滤器是用于执行过滤任务的对象,它可以在请求到达 Servlet 之前或响应发送给客户端之前执行一些额外的逻辑。
日志记录: 过滤器常用于记录请求和响应的日志,包括请求的路径、参数、处理时间等信息。
身份验证和授权: 过滤器可以用于实现身份验证和授权逻辑,例如检查用户是否已登录,是否具有足够的权限访问某个资源。
防御性编程: 过滤器可以用于对请求进行安全检查,防止潜在的攻击,比如阻止恶意请求、XSS(跨站脚本攻击)等。
性能监控: 过滤器可以用于收集请求的处理时间、资源使用等信息,用于性能监控和优化。
先说一下过滤器的三个核心方法:init 方法:在过滤器被创建并添加到容器时调用,在过滤器的生命周期中只被调用一次。doFilter 方法:是过滤器的核心方法,用于处理请求和响应。可以进行前置处理、请求转发或链的调用,以及后置处理。(FilterChain.doFilter)destroy 方法:在过滤器被销毁前调用,用于进行资源释放和清理工作。在过滤器的生命周期中只被调用一次。
编写自己的过滤器配置类: 会把web开头的请求率先通过我们定义的过滤器,我们可以在里面进行权限的校验、记录日志等。
多个过滤器,需要有执行顺序可以使用Spring注解@Order,也可以使用@WebFilter(urlPatterns="/web/order/"),通过请求去到下一个符合条件的过滤器!
咱们使用的注解,需要在启动类加上扫描,不然过滤器是不会生效的!
@ServletComponentScan。
/**
* @author wangzhenjun
* @date 2023/11/22 15:34
*/
@Slf4j
@WebFilter("/web/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("用户已经认证,继续处理");
log.info("用户有权限,继续处理");
chain.doFilter(request, response);
log.info("处理完成,放行之后");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
TOP