package com.kidgrow.zuul.filter; import com.kidgrow.authclient.properties.SecurityProperties; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.exception.KidgrowException; import com.kidgrow.common.interceptor.FeignRequestInterceptor; import com.kidgrow.common.model.ErrorCode; import com.kidgrow.common.utils.AddrUtil; import com.kidgrow.common.utils.DateCalUtil; import com.kidgrow.common.utils.DateUtils; import com.kidgrow.common.utils.StringUtils; import com.kidgrow.zuul.filter.support.ModifyHttpServletRequestWrapper; import eu.bitwalker.useragentutils.UserAgent; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.UUID; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: 请求前缀过滤器,增加请求时间
* @Project:
* @CreateDate: Created in 2020/2/4 14:49
* @Author: liuke */ @Slf4j @Component public class PreRequestFilter extends OncePerRequestFilter { @Autowired private SecurityProperties securityProperties; private AntPathMatcher antPathMatcher = new AntPathMatcher(); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { request.setAttribute("requestTime", new Date()); UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); String timeStamp=""; boolean v = true; /* 开启时间戳校验 */ if(securityProperties.getAuth().getTimestampenable()) { for (String path : securityProperties.getAuth().getHttpTimestampUrl()) { String url = request.getRequestURI(); if (antPathMatcher.match(path, request.getRequestURI())){ v=false; } } if (v) { try{ timeStamp = request.getHeader(CommonConstant.REQUEST_TIMESTAMP); log.info("请求时间戳为:"+timeStamp); if (StringUtils.isBlank(timeStamp)) { throw new KidgrowException(ErrorCode.BAD_TIMESTAMP.getCode(), ErrorCode.BAD_TIMESTAMP.getMessage()); } else { Date now = new Date(); // Date requestD = DateCalUtil.getDateByStr(timeStamp); Date requestD= DateCalUtil.getDateByStr(DateUtils.unixTimeStamp2Date(timeStamp,"")); int min = DateCalUtil.dateDiffMin(now, requestD); if (min > Integer.parseInt(securityProperties.getAuth().getTimestampnum())) { throw new KidgrowException(ErrorCode.BAD_TIMESTAMP.getCode(), ErrorCode.BAD_TIMESTAMP.getMessage()); } } } catch (Exception ex){ throw new KidgrowException(ErrorCode.BAD_TIMESTAMP.getCode(), ErrorCode.BAD_TIMESTAMP.getMessage()); } } } // 修复 请求防止流读取一次丢失问题 ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request); String sid = UUID.randomUUID().toString(); // 添加自定义请求头 requestWrapper.putHeader(CommonConstant.REQUEST_TIMESTAMP, timeStamp); requestWrapper.putHeader(FeignRequestInterceptor.X_REQUEST_ID, sid); response.setHeader(FeignRequestInterceptor.X_REQUEST_ID,sid); response.setHeader(CommonConstant.USER_AGENT_BROWSER, userAgent.getBrowser().toString()); response.setHeader(CommonConstant.USER_AGENT_SYSTEM, userAgent.getOperatingSystem().toString()); response.setHeader(CommonConstant.USER_AGENT_IP, AddrUtil.getRemoteAddr(request)); filterChain.doFilter(requestWrapper, response); } }