添加隐藏参数优化

This commit is contained in:
Wenchao Gong 2021-10-16 23:09:21 +08:00
parent dd46fa932f
commit 71ee37556d

View File

@ -1,6 +1,7 @@
package com.ruoyi.gateway.filter; package com.ruoyi.gateway.filter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.ruoyi.gateway.utils.GatewayUtils; import com.ruoyi.gateway.utils.GatewayUtils;
@ -57,17 +58,15 @@ public class CustomerGlobalFilter implements GlobalFilter, Ordered {
final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>(request.getQueryParams()); final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>(request.getQueryParams());
handleRule(headerAk, () -> queryParams.get(accessKeyName), route, request, accessKeyName); handleRule(headerAk, () -> queryParams.get(accessKeyName), route, request, accessKeyName);
queryParams.remove(accessKeyName); queryParams.remove(accessKeyName);
handleHiddenParams(route, queryParams, (json, map) -> { handleHiddenParams(route, queryParams, (next, map) -> {
Iterator<Map.Entry<String, Object>> iterator = json.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> next = iterator.next();
Object value; Object value;
if (Objects.isNull(value = next.getValue()) || StrUtil.isBlank(value.toString())) { if (Objects.isNull(value = next.getValue())) {
map.add(next.getKey(), StrUtil.EMPTY); map.add(next.getKey(), StrUtil.EMPTY);
} else if(value instanceof JSONArray) {
map.put(next.getKey(), ((JSONArray)value).toList(String.class));
} else { } else {
map.add(next.getKey(), value.toString()); map.add(next.getKey(), value.toString());
} }
}
}); });
URI newUri = UriComponentsBuilder.fromUri(request.getURI()) URI newUri = UriComponentsBuilder.fromUri(request.getURI())
.replaceQueryParams(unmodifiableMultiValueMap(queryParams)).build().toUri(); .replaceQueryParams(unmodifiableMultiValueMap(queryParams)).build().toUri();
@ -80,15 +79,11 @@ public class CustomerGlobalFilter implements GlobalFilter, Ordered {
MediaType mediaType = request.getHeaders().getContentType(); MediaType mediaType = request.getHeaders().getContentType();
if (MediaType.APPLICATION_JSON.equals(mediaType)) { if (MediaType.APPLICATION_JSON.equals(mediaType)) {
JSONObject jsonObj = JSONUtil.parseObj(body); JSONObject jsonObj = JSONUtil.parseObj(body);
String ak = handleRule(headerAk, () -> Arrays.asList(jsonObj.get(accessKeyName, String.class, handleRule(headerAk, () -> Arrays.asList(jsonObj.get(accessKeyName, String.class, true)),
true)), route, request, accessKeyName); route, request, accessKeyName);
jsonObj.remove(accessKeyName); jsonObj.remove(accessKeyName);
handleHiddenParams(route, jsonObj, (json, map) -> { handleHiddenParams(route, jsonObj, (next, map) -> {
Iterator<Map.Entry<String, Object>> iterator = json.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> next = iterator.next();
map.set(next.getKey(), next.getValue()); map.set(next.getKey(), next.getValue());
}
}); });
return Mono.just(jsonObj.toString()); return Mono.just(jsonObj.toString());
} else if (MediaType.APPLICATION_FORM_URLENCODED.equals(mediaType)) { } else if (MediaType.APPLICATION_FORM_URLENCODED.equals(mediaType)) {
@ -98,12 +93,18 @@ public class CustomerGlobalFilter implements GlobalFilter, Ordered {
accessKeyName.equals(param[0])).map(param -> param[1]).collect(Collectors.toList()), accessKeyName.equals(param[0])).map(param -> param[1]).collect(Collectors.toList()),
route, request, accessKeyName); route, request, accessKeyName);
final List<String[]> params = stream.filter(param -> !accessKeyName.equals(param[0])).collect(Collectors.toList()); final List<String[]> params = stream.filter(param -> !accessKeyName.equals(param[0])).collect(Collectors.toList());
handleHiddenParams(route, params, (json, list) -> { handleHiddenParams(route, params, (next, list) -> {
Iterator<Map.Entry<String, Object>> iterator = json.entrySet().iterator(); Object value;
while (iterator.hasNext()) { if (Objects.isNull(value = next.getValue())) {
Map.Entry<String, Object> next = iterator.next(); list.add(new String[]{next.getKey(), StrUtil.EMPTY});
} else if(value instanceof JSONArray) {
((JSONArray)value).stream().map(o -> String.valueOf(o)).forEach(v -> {
list.add(new String[]{next.getKey(), v});
});
} else {
list.add(new String[]{next.getKey(), next.getValue().toString()}); list.add(new String[]{next.getKey(), next.getValue().toString()});
} }
}); });
return Mono.just(params.stream().map(param -> param[0] + '=' + param[1]).collect(Collectors.joining("&"))); return Mono.just(params.stream().map(param -> param[0] + '=' + param[1]).collect(Collectors.joining("&")));
} }
@ -156,7 +157,7 @@ public class CustomerGlobalFilter implements GlobalFilter, Ordered {
* @param mapper * @param mapper
* @param <U> * @param <U>
*/ */
private <U> void handleHiddenParams(Route route, U result, BiConsumer<JSONObject, U> mapper) { private <U> void handleHiddenParams(Route route, U result, BiConsumer<Map.Entry<String, Object>, U> mapper) {
final Object obj = route.getMetadata().get(GatewayUtils.CONFIG_ADD_PARAM_KEY); final Object obj = route.getMetadata().get(GatewayUtils.CONFIG_ADD_PARAM_KEY);
if (Objects.isNull(obj)) { if (Objects.isNull(obj)) {
return; return;
@ -165,6 +166,10 @@ public class CustomerGlobalFilter implements GlobalFilter, Ordered {
if (json.isEmpty()) { if (json.isEmpty()) {
return; return;
} }
mapper.accept(json, result); Iterator<Map.Entry<String, Object>> iterator = json.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> next = iterator.next();
mapper.accept(next, result);
}
} }
} }