`
xyqck163
  • 浏览: 106285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Sping MVC 的 @ResponseBody 乱码问题的完美解决

阅读更多

 

关于Sping MVC  的   @ResponseBody  乱码问题的完美解决

 

重写了StringHttpMessageConverter 类,如下 

 

 

 

package org.springframework.http.converter;

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.util.FileCopyUtils;

/**
 * 通过重写解决了乱码问题
 * 
 * @author jiulong_ck
 * 
 */
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  //  在这里先写好自己使用的默认编码
	private final List<Charset> availableCharsets;
	private boolean writeAcceptCharset = true;

	public StringHttpMessageConverter() {
		super(new MediaType[] { new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL });
		this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
	}

	public void setWriteAcceptCharset(boolean writeAcceptCharset) {
		this.writeAcceptCharset = writeAcceptCharset;
	}

	public boolean supports(Class<?> clazz) {
		return String.class.equals(clazz);
	}

	protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {
		Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());
		return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));
	}

	protected Long getContentLength(String s, MediaType contentType) {
		Charset charset = getContentTypeCharset(contentType);
		try {
			return Long.valueOf(s.getBytes(charset.name()).length);
		} catch (UnsupportedEncodingException ex) {
			throw new InternalError(ex.getMessage());
		}

	}

	protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {
		if (this.writeAcceptCharset) {
			outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
		}

		// 重新定义 MediaType ,解决乱码
		/****************************/
		MediaType contentType = outputMessage.getHeaders().getContentType();
		Charset contentTypeCharset = getContentTypeCharset(contentType);
		contentType = new MediaType(contentType.getType(), contentType.getSubtype(), contentTypeCharset);
		outputMessage.getHeaders().setContentType(contentType);
		/****************************/
		
		Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType());
		FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset));
	}

	protected List<Charset> getAcceptedCharsets() {
		return this.availableCharsets;
	}

	private Charset getContentTypeCharset(MediaType contentType) {

		if ((contentType != null) && (contentType.getCharSet() != null)) {
			return contentType.getCharSet();
		}

		return DEFAULT_CHARSET;
	}
}
 
分享到:
评论

相关推荐

    mybatis+sping mvc mybatis+sping mvc

    mybatis+sping mvc mybatis+sping mvcmybatis+sping mvc mybatis+sping mvcmybatis+sping mvc mybatis+sping mvcmybatis+sping mvc mybatis+sping mvcmybatis+sping mvc mybatis+sping mvc

    sping MVC 简单小例子

    Spring MVC 是一个强大的Java Web开发框架,用于构建高效、模块化的Web应用程序。在这个"Spring MVC 简单小例子"中,我们将深入探讨如何利用它实现一个基础的"Hello, World!"程序,同时涵盖自定义Filter和Servlet...

    sping mvc 整合 mybatis

    sping mvc 整合 mybatis

    简单模拟Sping MVC

    Spring MVC是Spring框架的一部分,主要用于构建Web应用程序的模型-视图-控制器(MVC)架构。这个简单的模拟项目旨在帮助开发者深入理解Spring...这不仅有助于增强你的编程技巧,还能提升你在实际项目中的问题解决能力。

    精通Sping MVC4

    《精通Spring MVC4》这本书是Java开发者深入理解并掌握Spring MVC框架的重要参考资料。Spring MVC作为Spring框架的一部分,是构建现代Web应用程序的首选工具之一。它提供了模型-视图-控制器(MVC)架构模式,帮助...

    Sping MVC各种依赖包。

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。在Spring MVC中,依赖管理是非常关键的一环,因为它确保了项目中使用的库版本的一致性和兼容...

    网站推广利用Sping MVC框架实现销售平台的推广

    网站推广利用Sping MVC框架实现销售平台的推广

    校园商铺平台,JavaEE,Sping,Sping MVC,MyBatis,Spring Boot,Maven

    校园商铺平台采用流行的SSM(Sping,Sping MVC,MyBatis)框架开发,采用Maven管理资源,适合学习和二次开发,另外原来还有完整的一步一步带着做出这个项目的16章视频,文件内有视频获取方式。

    Sping MVC所需所有架包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中,包含了一系列用于配置Spring MVC 3.2版本框架所需的jar包。这些库是开发Spring MVC...

    sping mvc的小例子

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在本示例中,"spring+spring mvc" 提供了一个简单的小型应用实例,...

    最新java技术栈RBAC基于spring security与sping mvc分布式权限管理系统

    本项目“最新java技术栈RBAC基于spring security与sping mvc分布式权限管理系统”旨在利用先进的技术栈来实现这一目标。下面将详细介绍这个系统的核心知识点。 1. **Spring MVC**:Spring MVC是Spring框架的一部分...

    sping4+sping mvc +hibrenate(ssh框架)

    Spring、Spring MVC 和 Hibernate 是Java开发中非常流行的三大框架,它们通常被组合使用,被称为SSH框架,用于构建高效、模块化的Web应用程序。Spring是整个应用的基础,提供了依赖注入(DI)和面向切面编程(AOP)...

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    sping web mvc

    Spring Web MVC是Spring框架的一部分,专门用于构建Web应用程序。它为开发者提供了一种优雅的方式来处理HTTP请求和响应,实现模型-视图-控制器(MVC)设计模式。在这个入门技术源码中,我们可以深入理解Spring MVC的...

    Spring MVC+ibaties

    **Spring MVC + MyBatis 深度解析** 在当今的Java Web开发中,Spring MVC 和 MyBatis 是两个非常重要的框架。Spring MVC 作为Spring框架的一部分,负责处理Web请求和响应,提供了一种优雅的方式来组织和解耦应用...

    Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    主要介绍了Spring MVC参数校验的相关资料,主要是针对`@RequestBody`返回`400`的问题,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。

    全文检索引擎lucene的研究和使用(sping mvc + jpa 编写的案例)

    它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以将业务逻辑、用户界面和控制逻辑分离,便于维护和扩展。在本项目中,Spring MVC可能被用来处理HTTP请求,展示搜索结果,并与Lucene集成,实现搜索功能。 1...

Global site tag (gtag.js) - Google Analytics