如何解决springboot参数传中文乱码

2023-10-26

前言

本文案例来自业务部门的一个业务场景。他们的业务场景是他们部门研发了一个微服务上下文透传组件,其透传原理也挺简单的,就是通过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() {
    }
}

写个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

image.png
百度来的基本上都是长这样。不过在spring5版本WebMvcConfigurerAdapter这个类已经过时。其替代方式是实现WebMvcConfigurer接口或者继承WebMvcConfigurationSupport。不过如果使用WebMvcConfigurationSupport,则会使springboot的mvc自动装配失效。失效的原因是
image.png
拓展一点小知识,加上@EnableWebMvc同样也会springboot的mvc自动装配失效。其原因是
image.png
org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration这个配置类继承WebMvcConfigurationSupport
image.png
介绍那么多种方案,并没有解决按例的问题。那问题点出在哪里?前边案例我们提到过,在feign调用时,会把threadlocal的参数塞到header里面。真正乱码的问题点就在这里,header是不支持中文传输的,如果你硬要传输,基本上接收方接到就是???这种看似乱码的符号

破题关键

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

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

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

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

总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决springboot参数传中文乱码 的相关文章

  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • Spring 5.0.3 依赖问题

    升级到 spring 5 0 3 后我遇到以下问题 09 25 29 141 ERROR org jboss msc service fail ServerService Thread Pool 175 MSC000001 Failed t
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • JERSEY:错误跟踪:java.lang.IllegalStateException:实体输入流已关闭

    我正在使用 Jersey 2 x 以下是我的控制器 GET Path id Produces application json public Response getUser PathParam id int userId Context
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 为什么 java.util.Arraylist#clear 按照 OpenJDK 中的方式实现?

    http grepcode com file repository grepcode com java root jdk openjdk 6 b14 java util ArrayList java 473 http grepcode co
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • 我怎样才能限定我不“拥有”的自动装配设置器

    要点是 Spring Batch v2 测试框架具有JobLauncherTestUtils setJob与 Autowired注解 我们的测试套件有多个Job类提供者 由于这个类不是我可以修改的东西 我不确定如何限定它自动连接的作业 每个

随机推荐

  • 数据库之MySQL基本操作

    数据库之MySQL 可以把MySQL看成一款支持远程操作文件的软件 库 gt gt gt 文件夹 表 gt gt gt 文件 记录 gt gt gt 文件内一行行的数据叫做一条条的记录 表头 就是表格的第一行数据 字段 字段名 字段类型 本
  • 【VUE3+AntV-G2】数据可视化 封装antv G2 气泡图组件

    一些废话 默默做前端 分享一些自己在项目需求实现中遇到的奇妙问题 主要是网上搜索不到解决办法自己解决后的总结方法和解决办法但不全面 自己整理总结的存档 事发背景 原型绘制了需要同时展示多个指标的数据气泡图 想到可以使用antv的气泡图 刚好
  • 顺序表和单链表基本操作的实现

    1 顺序表的建立 取指定元素 返回指定元素位置 2 顺序表中插入新元素 删除指定元素操作的实现 3 单链表的建立 取指定元素 返回指定元素位置 4 单链表中插入新元素 删除指定元素操作的实现 该主要完成单链表中基本操作的实现 单链表中的元素
  • 【C语言】简易计算器的模拟实现

    前言 最近在复习指针和数组 发现之前没写过利用函数指针数组来实现计算器的博客 所以今天就来写一下 引入 先来复习一下函数指针和函数指针数组的知识 函数指针 语法格式 函数返回类型 pf 函数各个参数的类型 函数名 例子 include
  • 2020-09-20

    一 Bootstrap Jumbotron 超大屏幕 1 1 基本的超大屏幕可以通过在 元素 中添加 jumbotron 类来创建 jumbotron
  • adf盖怎么打开_打印机墨盒怎么更换,看我这篇文章就够了

    有的小伙伴后台私信小编 说想更换打印机墨盒却不知道怎么下手 今天小编就给大家说说 教科书 般的墨盒更换方法 今天以HP deskjet 4729 为例来讲解 步骤一 取出需要更换的墨盒 1 将打印机接通电源并开机 请确保打印机处于正常待机状
  • Repeater没有数据时显示空行

    网上看了很多一般都是重写repeater控件 不过发现一个超简单的方法 直接利用FooterTemplate 在里面加上
  • 大佬给鸿星尔克写了一个 720° 看鞋展厅

    前段时间 在各大互联网平台 鸿星尔克成为了顶流般的存在 鸿星尔克官方账号更是一夜暴涨百万粉丝 直播间产品也被卖到下架 在鸿星尔克捐款的消息出现之后 在短短的几天里 鸿星尔克的销售额就超过了上半年的总销售额 一周前 有一个程序员 蓝色的秋风在
  • 使用Keras中的LSTM完成温度预测问题,并对模型提出不同的改进方法,如:逆向、双向、丢包等

    前言 本例使用的是一个天气时间序列数据集 由德国耶拿的马克思普朗克生物地球化学研究所的气象站记录 这个例子作为初学者必看的例子之一 在这个数据集中 每十分钟记录14个不同的量 比如风向 湿度等 其中包含多年的记录 最原始的数据可以追溯到20
  • 服务器 多个操作系统,多个不同操作系统服务器

    多个不同操作系统服务器 内容精选 换一换 切换操作系统是为您的云服务器重新切换一个系统盘 切换完成后云服务器的系统盘ID会发生改变 并删除原有系统盘 如果云服务器当前使用的操作系统不能满足业务需求 如软件要求的操作系统版本较高 您可以选择切
  • 金字塔思维

    金字塔思维让表达主题明确 人们很难记住7个以上的东西 条理清晰的文章有金字塔结构 搭建金字塔 缺乏思想的句子不是好句子
  • MySQL触发器

    按照 MySQL必知必会 的例子创建触发器 结果报错 因为在触发器中允许调用存储过程 执行INSERT UPDATE DELETE等操作 但却唯独不允许返回任何结果 仔细一查 原来是版本变更导致的问题 创建成功的代码 先定义用户变了 a 或
  • java使用libreOffice预览word,ppt,txt等文档

    首先电脑上需要下载libreOffice 中文官网下载地址 https zh cn libreoffice org download libreoffice 安装过程较为简单 安装完需要重启完成配置 不要安装在中文目录下 验证libreOf
  • 微博存在的伦理道德问题

    开心的事写在微信 生活的事写在qq 伤心的事写在微博 因为微信里有父母 qq里有朋友 微博里有自己 微博作为一种即时媒体 已经成为大家宣泄自己情绪的场所了 它 开放式讨论 的共同优势 是人们在社会热点新闻特别是突发事情发作后讨论事故缘由 考
  • 熵 熵的简单理解和实例

    熵 熵的简单理解和实例 熵是信息量 越大越混乱 越小越确定 1 熵的由来 假设两个相互独立随机变量 x y的概率分布分别为p x p y 那么联合概率分布 P x y p x p y P x y p x p y P x y p x p y
  • 10 个免费学习编程的最佳网站

    来源 https us niemvuilaptrinh com article 11 webiste to practice code online 一旦我们开始学习了编程语言的基础知识 接下来 我们要将这些知识应用到实际项目中 就是要更长
  • [JAVA][2013蓝桥杯预赛 JAVA本科B组][世纪末的星期]

    标题 世纪末的星期 曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不可能是星期一 于是 谣言制造商 又修改为星期日
  • 如何使用element-ui进行主题的切换呢

    我们在使用element ui框架的时 有很多时候主题的配色都是我们不喜欢的 那这个时候element ui的组件库就帮助我们推出了一套主题定制 用来帮助我们切换主题 方法也很简单 在项目中改变sass变量 首先在项目中src文件创建一个s
  • Python3.9 解决 ImportError: No system module pywintypes (pywintypes39.dll) 的方法

    今天在使用 pywintypes 库的时候 莫名其妙就出现了 ImportError No system module pywintypes pywintypes39 dll 报错 详细报错信息如下 解决方法如下 项目使用的是虚拟环境 第一
  • 如何解决springboot参数传中文乱码

    前言 本文案例来自业务部门的一个业务场景 他们的业务场景是他们部门研发了一个微服务上下文透传组件 其透传原理也挺简单的 就是通过springboot拦截器把请求参数塞进threadlocal 然后下游通过threadlocal取到值 服务之