1. 程式人生 > >spring mvc3.1 @ResponseBody註解生成大量Accept-Charset

spring mvc3.1 @ResponseBody註解生成大量Accept-Charset

ole converter pre catch 字符 註意 trac rri 註解

Spring3 [email protected](Accept-Charset會達到4K+)。原因在於默認情況下StringHttpMessageConverter.writeInternal()會將全部可用字符集回寫到response響應頭中:問題來了技術分享


解決方案:

一般我們都會重寫springs mvc的HttpMessageConverter。改為utf-8編碼:

package com.goldpalm.core.spring.mvc;

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;

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;

/**
 * 重寫SpringMVC的字符串轉換器。使用UTF-8編碼
 * @since 2012-7-5 下午2:28:19
 * @author Jesse Lu
 */
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() {
        super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL);
        this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
    }
    
    /**
     * Indicates whether the [email protected]
/* */ Accept-Charset} should be written to any outgoing request. * <p> * Default is [email protected] true}. */ public void setWriteAcceptCharset(boolean writeAcceptCharset) { this.writeAcceptCharset = writeAcceptCharset; } @Override public boolean supports(Class<?

> clazz) { return String.class.equals(clazz); } @SuppressWarnings("rawtypes") @Override protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset)); } @Override protected Long getContentLength(String s, MediaType contentType) { Charset charset = getContentTypeCharset(contentType); try { return (long) s.getBytes(charset.name()).length; } catch (UnsupportedEncodingException ex) { // should not occur throw new InternalError(ex.getMessage()); } } @Override protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { if (writeAcceptCharset) { outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); } Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset)); } /** * Return the list of supported [email protected]

/* */ Charset}. * <p> * By default, returns [email protected] Charset#availableCharsets()}. Can be overridden in subclasses. * @return the list of accepted charsets */ protected List<Charset> getAcceptedCharsets() { return this.availableCharsets; } private Charset getContentTypeCharset(MediaType contentType) { if (contentType != null && contentType.getCharSet() != null) { return contentType.getCharSet(); } else { return DEFAULT_CHARSET; } } }


在xm中配置:註意紅色圈起來的配置

技術分享


<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="com.goldpalm.core.spring.mvc.UTF8StringHttpMessageConverter">
				<property name="writeAcceptCharset" value="false" />
			</bean>
		</mvc:message-

spring mvc3.1 @ResponseBody註解生成大量Accept-Charset