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<br>
|
*
|
* @Description: 请求前缀过滤器,增加请求时间<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/4 14:49 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@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);
|
}
|
}
|