如何解决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参数传中文乱码 的相关文章

  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 通过浏览器关闭页面时出现 Websocket 错误:“已建立的连接被主机中的软件中止”

    我开发了一个实时通知系统Spring 4 代码可以在 Github 上找到 github com vdenotaris Spring Messaging https github com vdenotaris Spring Messagin

随机推荐

  • 数据库之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取到值 服务之