解决SpringBoot应用中静态资源乱码问题

对于SpringBoot静态目录下的文本资源,如果包含中文,直接访问内容中的中文会乱码。尽管文件本身是UTF8编码。

乱码演示

准备一个静态资源文件 - foo.js

image

文件内容包含了中文

/*
	SpringBoot中文社区
 */
 
console.log('https://springboot.io');

浏览器直接访问,乱码

究其原因,是因为ContentType中,没有指定content的编码。

解决

我试图寻找spring的配置来解决这个问题,但是没有找到。最后我发现 Undertow 服务器提供了MimeMapping 接口。也就是说,可以自定义不同类型文件的contentType。

那么我们只需要在默认文本文件类型的ContentType后面,添加上编码就OK了。

Undetow 配置类

import org.springframework.boot.web.embedded.undertow.UndertowDeploymentInfoCustomizer;
import org.springframework.context.annotation.Configuration;

import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.MimeMapping;

/**
 * 
 * Undertow 服务器配置
 * 
 * @author KevinBlandy
 *
 */
@Configuration
public class UndertowConfiguration implements UndertowDeploymentInfoCustomizer {

	@Override
	public void customize(DeploymentInfo deploymentInfo) {

		/**
		 * 覆盖默认文本类型的字符ContentType, 添加UTF8编码
		 * 
		 * @see io.undertow.util.MimeMappings
		 */
		deploymentInfo.addMimeMapping(new MimeMapping("html", "text/html; charset=utf-8"));
		deploymentInfo.addMimeMapping(new MimeMapping("htm", "text/html; charset=utf-8"));
		deploymentInfo.addMimeMapping(new MimeMapping("css", "text/css; charset=utf-8"));
		deploymentInfo.addMimeMapping(new MimeMapping("js", "application/javascript; charset=utf-8"));
		deploymentInfo.addMimeMapping(new MimeMapping("json", "application/json; charset=utf-8"));
		deploymentInfo.addMimeMapping(new MimeMapping("md", "text/markdown; charset=utf-8"));
	}
}

问题解决

添加配置类后,重启应用。访问资源文件,中文已经正常显示。