本文仅讲述过滤器,拦截器文章链接在本文最下方。

什么是Filter

可以拦截所有的请求与响应。

过滤器Filter 生命周期

它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

使用过滤器Filter完整的流程是

过滤器Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Tomcat容器结构

来自于网络

我们看一下 Tomcat容器结构:

过滤器Filter 在 拦截器Interceptor前面。就可以得知一个请求从Filter到Servlet、Interceptor、Controller。这里也就是全局异常处理类(只能处理Controller层的异常)无法处理Filter报错的原因!

什么场景 会使用 Filter?

  • 请求日志:比如 张三 XX时间 访问了 什么什么接口 等待
  • 用户授权:负责检查用户请求,根据请求过滤用户非法请求。
  • 非标准编码的请求解码:可以解决 一些字符集啊 之类的问题,(早期Servlet与Tomcat的问题)

多个过滤器或拦截器的执行顺序

一个请求或响应可以被多个自定义过滤器Filter过滤或拦截器拦截,控制其加载顺序,一般是类上加注解 @Order(数值越小,拦截执行优先级越大)

执行的优先级是按照过滤器类名(字符串)的自然排序,如Axx与Bxx,那么肯定是Axx先执行

如何使用Filter?

实现javax.servlet.Filter 接口,重写其 init()、destory()、doDilter()方法

1、在启动类上开启 @ServletComponentScan

@ServletComponentScan

2、在config 层 写一个 配置类

import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;

/**
 * 作者:臧立昆
 * 2020/10/16 13:11
 */
@Slf4j
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        //log.info(filterConfig.getFilterName() + " init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        try {
            //TODO 接口放行,如果不想让接口放行,让代码不执行本行即可!
            chain.doFilter(request, response);
        } catch (Exception e) {
            //log.error("error!", e);
        }
        //log.info("过滤器 end");
    }

    @Override
    public void destroy() {
    }
}

过滤器相关代码基本完成!

过滤器限制Token 伪代码,可直接用!

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 作者:臧立昆
 * 2020/10/16 13:11
 */
@Slf4j
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
@Order(-1) // 加载优先级 数字越小
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        //log.info(filterConfig.getFilterName() + " init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

        try {
            //todo 将servlet的request转为 HttpServletRequest,方便我们快速获取:前端请求的内容:请求头、请求体。
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            String token = httpServletRequest.getHeader("token");
            //todo 我们校验相关的token,如JWT校验一下,在决定是否放行接口!        
            if (Please check Request,if you want to filter!) {
                chain.doFilter(request, response);
            } else {
                log.error("Token 无效,请输入有效Token");
            }

        } catch (Exception e) {
            log.error("过滤器过滤Token 出现异常,可能是Token无效导致的异常!");
        }

    }

    @Override
    public void destroy() {
    }
}

想要了解拦截器,请查看:

发表评论

您的电子邮箱地址不会被公开。

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源