|
|
@@ -0,0 +1,121 @@
|
|
|
+package com.java110.service.configuration;
|
|
|
+
|
|
|
+
|
|
|
+import brave.internal.Nullable;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.core.convert.TypeDescriptor;
|
|
|
+import org.springframework.core.convert.converter.GenericConverter;
|
|
|
+import org.springframework.util.ObjectUtils;
|
|
|
+import org.springframework.web.bind.annotation.RequestHeader;
|
|
|
+
|
|
|
+import java.net.URLDecoder;
|
|
|
+import java.nio.charset.Charset;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+public class StringDecoderForHeaderConverter implements GenericConverter {
|
|
|
+ private Logger logger = LoggerFactory.getLogger(StringDecoderForHeaderConverter.class);
|
|
|
+
|
|
|
+ private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
|
|
+ private static final String NO_NAME = "NO_NAME";
|
|
|
+
|
|
|
+ private Charset charset;
|
|
|
+
|
|
|
+ public StringDecoderForHeaderConverter(@Nullable Charset charset) {
|
|
|
+ this.charset = charset;
|
|
|
+ if (this.charset == null) {
|
|
|
+ this.charset = DEFAULT_CHARSET;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * +返回编码值
|
|
|
+ * @return charset
|
|
|
+ */
|
|
|
+ public Charset getCharset() {
|
|
|
+ return charset;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * +设置编码值
|
|
|
+ * @param charset 编码值
|
|
|
+ */
|
|
|
+ public void setCharset(Charset charset) {
|
|
|
+ this.charset = charset;
|
|
|
+
|
|
|
+ if (this.charset == null) {
|
|
|
+ this.charset = DEFAULT_CHARSET;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Set<ConvertiblePair> getConvertibleTypes() {
|
|
|
+ return Collections.singleton(new ConvertiblePair(String.class, String.class));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
|
|
|
+ if (ObjectUtils.isEmpty(source)) {
|
|
|
+ return source;
|
|
|
+ }
|
|
|
+
|
|
|
+ String name = needDecoder(source, targetType);
|
|
|
+ if (name != null) {
|
|
|
+ return convert(source.toString(), name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return source;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * +是否需要解码
|
|
|
+ * @param source 待处理的值
|
|
|
+ * @param targetType 类型
|
|
|
+ * @return 非null:需要解码;null:无需解码
|
|
|
+ */
|
|
|
+ private String needDecoder(Object source, TypeDescriptor targetType) {
|
|
|
+ RequestHeader requestHeader = targetType.getAnnotation(RequestHeader.class);
|
|
|
+ Class<?> type = targetType.getType();
|
|
|
+ if (requestHeader != null && type == String.class) {
|
|
|
+ if (source.toString().indexOf("%") >= 0) {
|
|
|
+ String name = requestHeader.name();
|
|
|
+ if (name == null || name.equals("")) {
|
|
|
+ name = requestHeader.value();
|
|
|
+ }
|
|
|
+ if (name == null || name.equals("")) {
|
|
|
+ name = NO_NAME;
|
|
|
+ }
|
|
|
+
|
|
|
+ return name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * +结果解码
|
|
|
+ * @param source 待解码的结果
|
|
|
+ * @param name 参数名称
|
|
|
+ * @return 解码后的结果
|
|
|
+ */
|
|
|
+ private String convert(final String source, final String name) {
|
|
|
+ if (logger.isDebugEnabled()) {
|
|
|
+ logger.debug("Begin convert[" + source + "] for RequestHeader[" + name + "].");
|
|
|
+ }
|
|
|
+ String _result = null;
|
|
|
+ try {
|
|
|
+ _result = URLDecoder.decode(source, this.charset.name());
|
|
|
+ if (logger.isDebugEnabled()) {
|
|
|
+ logger.debug("Success convert[" + source + ", " + _result + "] for RequestHeader[" + name + "].");
|
|
|
+ }
|
|
|
+
|
|
|
+ return _result;
|
|
|
+ } catch(Exception e) {
|
|
|
+ logger.warn("Fail convert[" + source + "] for RequestHeader[" + name + "]!", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ return source;
|
|
|
+ }
|
|
|
+}
|