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 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; } }