springboot参数传中文乱码的解决方案

前言

本文案例来自业务部门的一个业务场景。他们的业务场景是他们部门研发了一个微服务上下文透传组件,其透传原理也挺简单的,就是通过springboot拦截器把请求参数塞进threadlocal,然后下游通过threadlocal取到值,服务之间进行feign调用时,再把threadlocal的参数塞到header头里面。这个组件一直用得好好的,突然有一天因为传的参数值是中文,导致乱码。他们通过尝试下面的各种方案,都无法解决。最后就让我们部门排查处理。

业务部门的实现思路

他们一开始的思路方向是参数编码不一致导致中文乱码。于是他们就朝这个方向努力着,于是就有了如下方案

方案一:

String value = new String("我是中文乱码".getBytes("ISO-8859-1"),"UTF-8");

这个是常用解决字符串中文乱码的方法之一

方案二:编写字符编码过滤器

@WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter{
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 HttpServletRequest request = (HttpServletRequest) servletRequest;
 HttpServletResponse response = (HttpServletResponse) servletResponse;
 request.setCharacterEncoding("UTF-8");
 response.setCharacterEncoding("UTF-8");

 filterChain.doFilter(request , response);
 }
 @Override
 public void destroy() {
 }
}

然后启动类上加上@ServletComponentScan。@WebFilter是servlet3.0才有的注解。当然这个过滤器你还可以这么写

public class CharacterEncodingFilter implements Filter{
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 HttpServletRequest request = (HttpServletRequest) servletRequest;
 HttpServletResponse response = (HttpServletResponse) servletResponse;
 request.setCharacterEncoding("UTF-8");
 response.setCharacterEncoding("UTF-8");

 filterChain.doFilter(request , response);
 }
 @Override
 public void destroy() {
 }
}

然后启动类上加上@ServletComponentScan。@WebFilter是servlet3.0才有的注解。当然这个过滤器你还可以这么写

public class CharacterEncodingFilter implements Filter{
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 HttpServletRequest request = (HttpServletRequest) servletRequest;
 HttpServletResponse response = (HttpServletResponse) servletResponse;
 request.setCharacterEncoding("UTF-8");
 response.setCharacterEncoding("UTF-8");

 filterChain.doFilter(request , response);
 }
 @Override
 public void destroy() {
 }
}

写个bean配置类,如下

 @Bean
 public FilterRegistrationBean registerAuthFilter() {
 FilterRegistrationBean registration = new FilterRegistrationBean();
 registration.setFilter(new CharacterEncodingFilter();
 registration.addUrlPatterns("/*");
 registration.setName("CharacterEncodingFilter");
 registration.setOrder(1);
 return registration;
 }

方案三:在application.yml指定编码格式为utf-8

spring:
 http:
 encoding:
 charset: utf-8
 enabled: true
 force: true

server:
 tomcat:
 uri-encoding: UTF-8

方案四:写个StringHttpMessageConverter

百度来的基本上都是长这样。不过在spring5版本WebMvcConfigurerAdapter这个类已经过时。其替代方式是实现WebMvcConfigurer接口或者继承WebMvcConfigurationSupport。不过如果使用WebMvcConfigurationSupport,则会使springboot的mvc自动装配失效。失效的原因是

拓展一点小知识,加上@EnableWebMvc同样也会springboot的mvc自动装配失效。其原因是

org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration这个配置类继承WebMvcConfigurationSupport

介绍那么多种方案,并没有解决按例的问题。那问题点出在哪里?前边案例我们提到过,在feign调用时,会把threadlocal的参数塞到header里面。真正乱码的问题点就在这里,header是不支持中文传输的,如果你硬要传输,基本上接收方接到就是???这种看似乱码的符号

破题关键

在把threadlocal的值塞到header里面时,先做下URLEncoder编码,形如

URLEncoder.encode(“我是中文乱码”,"UTF-8")

在接收header参数时,做下URLDecoder.解码,形如下

URLDecoder.decode(header中待解码的参数值, "UTF-8")

总结

方向错了,虽然再怎么努力看似也啥没卵用,不过至少可能会收获其他意想不到的东西

以上就是springboot参数传中文乱码的解决方案的详细内容,更多关于springboot参数传中文乱码的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决

    配置文件中是正常显示的中文,但是spring读取到的确是乱码. 我总共有两种解决办法, 第一种方法: 先复制或者备份一下你的配置文件的所有字符,打开设置将transparent native-to-ascii conversion选中,然后返回将之前的配置文件重新粘贴一遍(一定要将中文重新打一遍)如图: Transparent native-to-ascii conversion的意思是:自动转换ASCII编码. 他的工作原理是:在文件中输入文字时他会自动的转换为Unicode编码,然后在ide

  • 如何解决springboot读取配置文件的中文乱码问题

    在application.properties中填写中文信息,在读取该文件时会出现中文乱码问题. 比如:application.properties内容: student.name=小康 student.age=15 解决方法:我用的是IDEA,首先File->settings->Code style->File Encoding 把所有的编码都设为UTF-8就好了. 再次运行,得出正常结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • SpringBoot mail中文附件乱码的解决方法

    前一段时间做过一个邮件发送的服务,以前大体都测试过,文本.图片.附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示: 咋一看不像乱码,抱着试试看的态度,为MimeMessageHelper硬性加了编码: helper.addAttachment(MimeUtility.encodeText(fileName), file); 并且对文件名称加了转码: MimeUtility.encodeText(attachmentFilename) 但是,如果你跟进源码会发现sprin

  • springboot返回前端中文乱码的解决

    尝试了各种防止中文乱码的方式,但是还是乱码;最后还是细节问题导致; 解决方式: 以及俩种方式是百度的,我的问题不是这俩块 1.在requestMapping 中添加 produces @RequestMapping( value = "/login", produces = "application/json;charset=utf-8", method = RequestMethod.POST ) 2.在application.yml 中添加配置 spring:

  • springboot参数传中文乱码的解决方案

    前言 本文案例来自业务部门的一个业务场景.他们的业务场景是他们部门研发了一个微服务上下文透传组件,其透传原理也挺简单的,就是通过springboot拦截器把请求参数塞进threadlocal,然后下游通过threadlocal取到值,服务之间进行feign调用时,再把threadlocal的参数塞到header头里面.这个组件一直用得好好的,突然有一天因为传的参数值是中文,导致乱码.他们通过尝试下面的各种方案,都无法解决.最后就让我们部门排查处理. 业务部门的实现思路 他们一开始的思路方向是参数

  • pyftplib中文乱码问题解决方案

    这篇文章主要介绍了pyftplib中文乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 采用pyftpdlib启动ftp服务端,ftp客户端在上传文件的时候,如果不指定字符编码,如果遇到中文,可能会乱码:网上找了很多资料,但是他们的客户端都是基于python实现的.还是没法解决我得问题 于是重新:FTPHandler的decode方法 def decode(self, bytes): return bytes.decode('ut

  • SpringMVC 中文乱码的解决方案

    背景 举个例子,出现中文乱码的例子:提交表单的时候. 表单 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/c02/t1" method=&quo

  • SpringMVC Restful风格与中文乱码问题解决方案介绍

    目录 基本要点 1.定义 2.传统方式与Restful风格的区别 3.如何使用Restful风格 4.为什么要用restful 5.乱码问题 基本要点 1.定义 根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式 2.传统方式与Restful风格的区别 在我们学习restful风格之前,我们请求接口,都是使用http://localhost:8080/controller?method=add这种方式携带接口所需要的参数 而调用restful风格的接口时,我们可以改成htt

  • MySql安装步骤图文教程及中文乱码的解决方案

    MySql Server安装步骤如下所示: 1安装MySql Server 2 安装MySqlServer管理工具 解压中文语言包,将文件复制到安装目录下覆盖 文件覆盖后,打开软件设置语言为中文(CN) 3 MySqlServer开发注意事项(C#) 1.联接字符串:"Server=localhost;Database=100;Uid=root;Pwd='root'" 2.引用MySql.Data.dll;using MySql.Data.MySqlClient; 3.使用MySqlC

  • Sublime Text 打开Java文档中文乱码的解决方案

    问题: 打开文档后出现中文乱码如图 1.在安装插件之前,首先要安装package control这个组件,才能够给Sublime Text安装各种插件 打开Sublime Text,按 ctrl+` 或者点击菜单栏 View下的Show Console 调出console == Sublime Text2 对于Sublime Text2,输入粘贴以下代码到底部命令行,并回车 import urllib2,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7

  • JSP页面传参出现中文乱码的解决方案

    很多jsp程序员都遇到过这样的情况,jsp页面传递参数到servlet,只要参数有中文就是乱码,且大多数是??????乱码,尝试了网上比较普遍的好多种办法都不行,最后加了一句话解决问题,这里分享给大家供大家参考. 1.打开tomcat安装目录 2.找到conf文件夹 3.打开里面的server.xml 4.找到 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000&qu

  • ajax中文乱码问题解决方案

    ajax中文乱码问题在中文中经常会出现这种问题,其实只要稍加注意就不会出现ajax中文乱码这回事情了,注意前后台编码一致.你用的是中文.而ajax传输数据的时候用的是utf-8 ,还有对ajax get方法时最好escape 或urlcode, 复制代码 代码如下: <%@ page contenttype="text/html;charset=gb2312%> 如果是用servlet就加 复制代码 代码如下: response.setcontenttype("text/h

  • php url地址栏传中文乱码解决方法集合

    php地址栏传中文$_GET下来后乱码,urlencode和urldecode用法详解url编码语法: string urlencode(string str);返回值: 字符串函数种类: 编码处理例如: 复制代码 代码如下: <?php$ChineseName="我的名字,是中文的哦";$EncodeStr=urlencode($ChineseName);echo "<a href=/cgi/personal.cgi?name=$EncodeStr>我的名

随机推荐