基础工具---解决中文乱码(HTTP中文乱码)

来源:互联网 发布:手机淘宝好评在哪里写 编辑:程序博客网 时间:2024/05/29 08:30
package com.ftvalue.customer.util;import org.springframework.http.HttpInputMessage;import org.springframework.http.HttpOutputMessage;import org.springframework.http.MediaType;import org.springframework.http.converter.AbstractHttpMessageConverter;import org.springframework.util.FileCopyUtils;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;/** * Created on 12/12/17. * * @author danhui */public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");    private final List<Charset> availableCharsets;    private boolean writeAcceptCharset = true;    public UTF8StringHttpMessageConverter() {        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();        supportedMediaTypes.add(new MediaType("text", "plain", DEFAULT_CHARSET));        supportedMediaTypes.add(MediaType.ALL);        setSupportedMediaTypes(supportedMediaTypes);        this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());    }    /**     * Indicates whether the {@code Accept-Charset} should be written to any outgoing request.     * <p>Default is {@code true}.     */    public void setWriteAcceptCharset(boolean writeAcceptCharset) {        this.writeAcceptCharset = writeAcceptCharset;    }    @Override    public boolean supports(Class<?> clazz) {        return String.class.equals(clazz);    }    @Override    protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {        Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());        return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));    }    private Charset getContentTypeCharset(MediaType contentType) {        if (contentType != null && contentType.getCharSet() != null) {            return contentType.getCharSet();        }        else {            return this.DEFAULT_CHARSET;        }    }    @Override    protected Long getContentLength(String s, MediaType contentType) {        if (contentType != null && contentType.getCharSet() != null) {            Charset charset = contentType.getCharSet();            try {                return (long) s.getBytes(charset.name()).length;            }            catch (UnsupportedEncodingException ex) {                // should not occur                throw new InternalError(ex.getMessage());            }        } else {            return null;        }    }    @Override    protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {        if (writeAcceptCharset) {            outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());        }        MediaType contentType = outputMessage.getHeaders().getContentType();        Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;        FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset));    }    /**     * Return the list of supported {@link Charset}.     *     * <p>By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses.     *     * @return the list of accepted charsets     */    protected List<Charset> getAcceptedCharsets() {        return this.availableCharsets;    }}