概要
很多微服务不可避免的要向外部发送请求, 很自然就会诞生对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();
}
}