zoukankan      html  css  js  c++  java
  • spring mvc3.1 @ResponseBody注解生成大量Accept-Charset

    Spring3 MVC使用@ResponseBody后会产生非常大的响应头(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 {@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); } @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 {@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; } 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-
    
  • 相关阅读:
    复习一下 .Net: delegate(委托)、event(事件) 的基础知识,从头到尾实现事件!
    雕虫小技: 给枯燥的 .Net 控制台程序(字符界面)来点儿心跳 (关于退格 '\b' 的使用)
    .Net Remoting 事件回调 Client 函数方法完整实例: C# 实现控制台网络聊天室 (Console Remoting ChatRoom)
    一气呵成得到 MSSQL DB 中所有表的字段默认值约束的 DDL SQL 脚本
    根据数据生成 INSERT INTO ... 的 SQL (.Net C#, TSQL Store Procedure 分别实现)
    .Net/C# 与 J2EE/Java Web Service 互操作完整实例
    TSQL: 关于 Varbinary(Hex,Int) 与 Varchar(HexString) 之间的(数据类型)转换
    Linux零碎记录之ulimit【堆栈大小、stack size、进程数限制、文件句柄限制、linux用户空间限制】
    svn之svn:ignore命令行设置
    C语言零碎记录之extern
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6808623.html
Copyright © 2011-2022 走看看