Spring中@RequestParam接收GET请求字符串参数乱码问题
问题原因
你看到的казанÑ�кй是典型的编码错配乱码:UTF-8编码的非ASCII字符被Web容器默认用ISO-8859-1字符集解析了。GET请求的查询参数(@RequestParam绑定的URL拼接参数)解码逻辑由Web容器控制,Spring默认不会强制覆盖容器的URI解码配置,因此当容器默认编码不是UTF-8时,就会出现英文/数字正常、非英文(俄文、中文等)乱码的问题。
解决方法
根据你部署项目的方式选对应配置即可:
Spring Boot 内置Tomcat部署
在项目配置文件中添加以下强制UTF-8编码的配置即可:
application.yml 配置示例:server: tomcat: uri-encoding: UTF-8 # 指定Tomcat对URI的解码字符集 servlet: encoding: charset: UTF-8 enabled: true force: true # 强制所有请求/响应使用UTF-8编码application.properties 配置示例:
server.tomcat.uri-encoding=UTF-8 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true外部Tomcat独立部署
找到Tomcat安装目录下conf/server.xml文件,修改HTTP连接器配置,添加URIEncoding="UTF-8"属性:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />保存配置后重启Tomcat即可生效。
非Spring Boot的原生Spring MVC项目
在web.xml中注册Spring提供的字符编码过滤器,强制所有请求走UTF-8编码:<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意事项
- 前端发起GET请求时,需要对URL中的非ASCII参数做UTF-8格式的URL编码,不要直接把原生俄文/中文等字符拼接在URL上。
- 可以用以下代码临时验证乱码原因,如果执行后打印出正常俄文,即可确认是编码配置问题:
注:该代码仅用于问题验证,不要作为正式业务逻辑使用。log.debug("解码验证结果: {}", new String(searchString.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
内容的提问来源于stack exchange,提问作者Seventh Donkey
相关产品推荐
相关产品推荐

