springmvc 全局编码_Java SpringMVC乱码问题排查和解决

本文主要探讨了SpringMVC中常见的乱码问题,包括页面、Controller、数据库和Redis存储的乱码解决方案。重点强调了设置编码的重要性,如请求编码、JDBC连接URL、文件及数据库编码,并提供了相关配置示例。
摘要由CSDN通过智能技术生成

Java是 Unicode 编码的,稍微不注意,就会出现乱码的问题,乱码的根本原因就是对文本进行编码的时候和解码的时候,所使用的编码字符集不一致导致的。像SpringMVC搭建的Web服务这类事,输入和输出在两个完全不同的环境中的情况,稍微不注意就会出现问题,这种MVC模式的乱码问题,一定要先定位乱码出现的位置,然后针对出现位置前后两个环境的编码配置差异,检查问题。

页面乱码情况

如果页面出现乱码,一般情况下是页面没有设置正确的编码格式,请操作下面第 3 点。

Controller层接受数据乱码

可以使用 System.out.println(request.getCharacterEncoding()); 在控制处打印接收到的参数的编码格式是否正确。解决方案如下:

ii:request.setCharacterEncoding("UTF-8"); 设置编码格式。

String str=newString((request.getParameter("bigQuestionTypeName")).getBytes("iso-8859-1"),"utf-8"); 强行改变编码,这种方法治标不治本,不推荐。

检查Spring配置文件中是否添加编码过滤,详细参照一下第 2 条。

重新启动服务器,重新启动IDE,重新在IDE上配置服务器。

数据库保存乱码

无论是Mybatis还是Hibernate,他们连接数据库的方式还是JDBC,所以要首先检查JDBC连接的URL是否指定正确的编码:

useUnicode=true&characterEncoding=UTF-8

另外,还需要检查数据库的相关配置,已经使用的表的相关配置,是否编码正确,详细参考第 5 点。

Spring Boot 使用RedisTemplate 存储键值出现乱码

最近使用spring-data-redis RedisTemplate 操作redis时发现存储在 redis 中的 value 不是设置的string值,前面还多出了许多类似\xac\xed\x00\x05t\x00这种字符串。

spring-data-redis的RedisTemplate模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,如下

private static RedisTemplate redisTemplate;

@Autowired(required=false)

public void setRedisTemplate(RedisTemplate redisTemplate) {

RedisSerializer stringSerializer = new StringRedisSerializer();

redisTemplate.setKeySerializer(stringSerializer);

redisTemplate.setValueSerializer(stringSerializer);

redisTemplate.setHashKeySerializer(stringSerializer);

redisTemplate.setHashValueSerializer(stringSerializer);

this.redisTemplate = redisTemplate;

}

或者可以使用 StringRedisTemplate 代替 RedisTemplate。

乱码问题需要注意的点

1. 确认文件的编码

如果使用的是 Eclipse 软件进行开发,建议把工作空间的字符集设为 UTF-8。IDEA默认就是UTF-8。

菜单导航栏上Window–>Preferences 打开”首选项”对话框,在左侧导航树,导航到 General–>Workspace,默认是GBK,设置为UTF-8。

确认工作空间的编码以后,还需要注意文件的编码是UTF-8。

导航栏window–>preferences,打开”首选项”对话框,左侧导航树,导航到 Genera–>Content Types,右边找到要修改的文件的类型,如 *.java,在下面的Default encoding,输入框中输入UTF-8->Update->OK

2. 确认添加编码过滤

确认在SpringMVC的配置文件中是否添加编码字符拦截配置,建议把该配置放在 xml 文件开头,以免因为拦截顺序没有生效。如在 web.xml 中添加如下配置:

CharacterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

CharacterEncodingFilter

/*

3. 确认 jsp 文件头部指定编码

对于jsp的页面,一定要在开头制定编码格式,如果没有制定编码,非常容易导致道Controller的数据解析乱码。

4. 确认Tomcat服务器指定编码

如果是Tomcat服务器,需要检查所使用的Tomcat服务器配置文件: server.xml 文件中是否指定相同的编码格式。

在 server.xml 文件中,找到节点 ,添加编码格式如下:

注意:如果没有生效,需要重启Tomcat服务器,甚至重启IDE。

5. 确认数据库编码

另外,还需要确认数据库的编码是否正确,如果使用的是MySQL,一般默认是 UTF-8,如果出现保存进入数据库之后乱码的情况,就要检测数据库的编码是否正,包括全局MySQL数据库编码设置,当前数据库配置,当前数据表配置,当前数据表字段配置。

下面给出MySQL的配置:

# 设置连接,查询结果等编码

SET character_set_client='utf-8';

SET character_set_connection='utf-8';

SET character_set_results='utf-8';

setnames 'utf-8'; # 设置数据库编码

# 查看数据库编码格式

show variables like 'character_set_%';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值