由於需求,需要在網關層做一些參數的替換,特此記錄一下,以下方式只針對GET請求
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * 過濾參數 * * @author * 2019-5-17 10:01 */ @Component public class ParametersFilter extends ZuulFilter { private static final Logger LOGGER = LoggerFactory.getLogger(ParametersFilter.class); private static final String KEY = "PARAMETER_FILTER_KEY"; @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 9; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { // 獲取到request RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); try { //是否攔截 // todo //防止錯誤重試多次轉換 Boolean isConver = (Boolean) request.getAttribute(KEY); if (isConver != null && isConver) { return null; } String method = request.getMethod(); LOGGER.info("將對請求進行替換, 方法為{}, url = {}", method, request.getRequestURI()); // get方法 if ("GET".equals(method.toUpperCase())) { //獲取參數 Map<String, String[]> parameterMap = request.getParameterMap(); if (parameterMap == null) { return null; } //替換,業務邏輯 Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams(); if (requestQueryParams == null) { requestQueryParams = new HashMap<>(parameterMap.size() * 2); } for (String key : parameterMap.keySet()) { String[] values = parameterMap.get(key); List<String> valueList = new LinkedList<>(); for (String value : values) { valueList.add(change(value)); } requestQueryParams.put(key, valueList); } //重新寫入參數 ctx.setRequestQueryParams(requestQueryParams); LOGGER.info("轉譯完成, url = {}", request.getRequestURI()); } } catch (Exception e) { LOGGER.error("參數替換異常:{}", e); } finally { request.setAttribute(KEY, true); } return null; } /** * 替換 * * @param data 數據 * @return 轉譯后數據 */ private String change(String data) { // todo return data; } }