网络过滤器webfilter

文章目录

概要

很多微服务不可避免的要向外部发送请求, 很自然就会诞生对http请求进行处理的诉求, 即网络过滤器, 比如对于出去的网络请求统一加一个header, 对出去的header进行一次合法判断等

使用场景

在工作中使用到的具体场景就是灰度, 因为要根据http请求是否携带灰度因素来确定是否是灰度请求, 那么就需要统一通过webFilter进行判断

需要添加@WebFilter注解

自定义过滤器: https://blog.youkuaiyun.com/qq_45515182/article/details/127217852

demo

public class MdcSetLogValueFilter implements Filter {
@Order(0)
@Component
@WebFilter(filterName = “mdcSetLogValueFilter”, urlPatterns = “/**”)
@Slf4j
public class MdcSetLogValueFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
    // 获取http请求实体类
    HttpServletRequest httpReq = (HttpServletRequest) servletRequest;
    // 增加上下文对象,避免初始化权限检查报错
    if (RequestContextManager.getCurrent(true) == null) {
        setCurrentRequest(httpReq);
    }
    // MDC 全称是 Mapped Diagnostic Context,可以粗略的理解成是一个线程安全的存放诊断日志的容器。
    try {
        //  根据http请求对MDC设置map, 键值对 
        MdcLogHelper.setCurrentThreadLogLayoutPatternValue(httpReq);
        // 正式对web请求进行过滤
        filterChain.doFilter(servletRequest, servletResponse);
    } finally {
        MdcLogHelper.clear();
    }
}

private void setCurrentRequest(HttpServletRequest httpReq) {
    try {
        RequestContextManager.setCurrent(RequestContextInitUtil.buildBasicContext(httpReq));
        RequestContext requestContext = (RequestContext) RequestContext.getCurrent(true);
        if (requestContext != null && requestContext.getUser() == null) {
            Serializable sessionUser = requestContext.getSession().get("JALOR5_USER");
            // 如果请求上下文没有用户信息,而Session中有,则从Session中初始化
            if (sessionUser != null) {
                requestContext.setUser((IUserPrincipal) sessionUser);
                // 从session 中取出来的 用户对象, 缩减占用空间
                this.reducesMemoryUsage(sessionUser);
            }
        }
    } catch (Exception e) {
        log.warn("setCurrentRequest error! msg=[{}]", ExceptionUtil.getExceptionMessage(e));
    }
}

private void reducesMemoryUsage(Serializable sessionUser) {
    if (sessionUser instanceof UserVO) {
        UserVO userVO = ((UserVO) sessionUser);
        userVO.reducesMemoryUsage();
    }
}

@Override
public void destroy() {
    Filter.super.destroy();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值