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

2024-02-20 21:08

本文主要是介绍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;}@Overridepublic boolean supports(Class<?> clazz) {return String.class.equals(clazz);}@SuppressWarnings("rawtypes")@Overrideprotected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));}@Overrideprotected Long getContentLength(String s, MediaType contentType) {Charset charset = getContentTypeCharset(contentType);try {return (long) s.getBytes(charset.name()).length;} catch (UnsupportedEncodingException ex) {// should not occurthrow new InternalError(ex.getMessage());}}@Overrideprotected 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-converters></mvc:annotation-driven>





这篇关于spring mvc3.1 @ResponseBody注解生成大量Accept-Charset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729547

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听