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