来源

近一段在开发接口平台,使用spring boot 开发,总体来说还是蛮顺利;
接口平台不可避免的让别人调用服务,也会去调用其它的外部接口;
突然有一天,某个服务商回调信息中出现了乱码,形如:��ֵʧ��,打破了宁静

分析过程

向服务商确认,该接口传递的参数使用GBK编码,WHT??现在还有用GBK的,不是用UTF8编码么?
马上确认我的程序编码:

server.tomcat.uri-encoding 未设置
http.encoding.charset: UTF-8
http.encoding.force-request: true

可以看到uri的配置未定义,搜索文档说明spring boot默认使用UTF8编码
下面两个是定义HTTP的字符集,用来设置request与response的字符集;
跟踪源码,发现这个字符参数会在CharacterEncodingFilter中用到,核心的方法是使用:request.setCharacterEncoding("UTF-8"),并且是一个全局的内容

解决过程

  1. 将得到的乱码用UTF-8编码再用GBK解码,如下代码,得到结果为:锟斤拷值失锟斤拷
    new String(source.getBytes("UTF-8"),"GBK"), 通过查资料得知,以GBK编码->UTF-8解码(出现乱码)->UTF-8编码(这步由于UTF8编码的特殊性,会增加部分头信息)->GBK解码(由于加了特殊部分,所以造成不可逆的结果)

  2. 在方法中调用request.getCharacterEncoding("UTF-8")无效,查询rquest的这个方法说明,只有在获取参数之前调用这个方法才有效,但在此之前spring 已帮我们做了很多事情,所以在这里无效;

  3. 自已写Filte来实现设置,但不知什么原因,还是无效

  4. 继承CharacterEncodingFilter,对特定url做特殊处理,结果是自定义的encoding生效了,原先的UTF8的 encodingFilter失效了,就算修改自己的Bean名字还不行

  5. 修改自定义EncodingFilter,实现多字符集的处理:
    定义encodingFilter:

public class MutiCharacterEncodingFilter extends CharacterEncodingFilter implements Ordered{//最高优先级private int order = Integer.MIN_VALUE;private List<String> mutiUrls = new ArrayList();private String mutiCharset =  "GBK";public List<String> getMutiUrls() {return mutiUrls;}public void setMutiUrls(List<String> mutiUrls) {this.mutiUrls = mutiUrls;}public String getMutiCharset() {return mutiCharset;}public void setMutiCharset(String mutiCharset) {this.mutiCharset = mutiCharset;}/***  @param charset* @param mutiCharset* @param mutiUrls* @param forceRequest* @param forceResponse*/public MutiCharacterEncodingFilter(String charset, String mutiCharset , List<String> mutiUrls, boolean forceRequest, boolean forceResponse) {super(charset,forceRequest,forceResponse);this.mutiUrls = mutiUrls;this.mutiCharset = mutiCharset;}public MutiCharacterEncodingFilter() {super();}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String path = request.getRequestURI();//如果是这个链接 执行mutyEncoding方法if(PathMatcherUtil.matchAny(mutiUrls,path)){if (mutiCharset != null) {if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(mutiCharset);}if (isForceResponseEncoding()) {response.setCharacterEncoding(mutiCharset);}}filterChain.doFilter(request,response);return ;}//否则 使用默认方法super.doFilterInternal(request,response,filterChain);}@Overridepublic int getOrder() {return order;}

在配置中设置相应内容:

  http:encoding:charset: UTF-8force-request: trueforce-response: falsemutiCharset: GBKmutiUrls:- /notify/test

在config中生成实例

    //第一种字符集@Value(value = "${spring.http.encoding.charset}")private String charset;//是否强制应用到request@Value(value = "${spring.http.encoding.force-request}")private boolean forceRequest;//是否强制设置到response@Value(value = "${spring.http.encoding.force-response}")private boolean forceResponse;/*** 自定义HTTP字符集 默认使用charset字符集 在特定情况下使用第二字符集 用于欧飞回调GBK编码* 仅对POST中的表单参数有效 对于URI中的参数无效 只能去修改tomcat的字符集编码 应该不致于做的这么绝吧* @return*/@Bean()@ConfigurationProperties(prefix = "spring.http.encoding")@ConfigurationPropertiesBindingpublic MutiCharacterEncodingFilter mutiCharacterEncodingFilter(){MutiCharacterEncodingFilter encodingFilter = new MutiCharacterEncodingFilter();encodingFilter.setEncoding(charset);encodingFilter.setForceRequestEncoding(forceRequest);encodingFilter.setForceResponseEncoding(forceResponse);return encodingFilter;}

到此问题解决,可以接收GKB编码的内容;

但同时也有缺陷,只适用于body的内容,不适用于链接到URL后面的请求参数,如果要支持,只能修改tomcat-uri-encoding为UTF-8,希望对大家有帮助.

转载于:https://www.cnblogs.com/417xiaoliu/p/9655520e4472d403c9b45ac3e9a50fe3.html

Spring boot 字符集编码相关推荐

  1. SpringBoot - Spring Boot 应用剖析

    文章目录 Spring MVC VS Spring Boot [HTTP 请求响应过程] [基于 Spring MVC 的 Web 应用程序开发流程] [基于 Spring Boot 的 Web 应用 ...

  2. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  3. 为什么越来越多的开发者选择使用Spring Boot

    Web应用开发背景 使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架,库以及整个生态系统.经过这么长时间的发展,Java作为一个成熟的语言, ...

  4. Spring Boot 1:Introduction

    Spring Spring 在不断发展的过程中,边界不断扩张,需要的配置文件也越来越多,使用起来也越复杂,项目中也经常因为配置文件配置错误产生很多问题. 即:Spring 逐渐变成了一个大而全的框架, ...

  5. spring boot 入门_玩转springboot2.x之快速入门开山篇

    Spring Boot简介 Spring Boot的目的在于创建和启动新的基于Spring框架的项目.Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合.大部分Spring ...

  6. 一文透析 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  7. Spring Cloud与微服务学习总结(8)——Spring Boot、微服务架构和大数据治理三者之间的故事

    前言 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况下,如 ...

  8. jar包是什么意思_为什么越来越多的开发者选择使用Spring Boot?

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 本篇是紧接着上一篇展开的,后续也会有一系列关于Spring Boot相关的文章,欢 ...

  9. spring boot开发环境搭建

    软件152 程永绩 1.什么是springboot: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特定的方式 ...

最新文章

  1. Python ord()函数和chr()函数
  2. 【转载 译自MarketWatch 】 华尔街疯人日记 (二十五)
  3. expect() php,Linux expect 的安装
  4. 在Spring中使用JDBC访问关系数据
  5. go语言php编译,Golang模板编译引擎FET
  6. Gorgeous Sequence线段树区间跟新
  7. 简单详细叙述FpGrowth算法思想(附python源码实现)
  8. 计算机毕业设计ssm电影院售票系统java项目mysql数据库
  9. SRAM VS DRAM
  10. Opencv -- 13像素值统计及平均值和方差的意义
  11. CRS-0215: Could not start resource 'ora.rac.rac2.inst'.
  12. python学习——把Excel的内容自动填写到Word
  13. eclipse升级adt
  14. 函数最值题目及答案_有关函数的极值与导数的测试题及答案
  15. 2022年最富有的科技亿万富翁前二十名,中国占3位
  16. python中 1%2等于什么_穷人和富人就差1%的努力——python模拟社会财富分配游戏
  17. vue加载视频流,实现直播功能
  18. 圣斗士星矢游戏抽奖计算机怎么计算,圣斗士星矢手游抽奖技巧解析 教你抽橙卡...
  19. Java-高级技术(二)
  20. 设计原则(一)开-闭原则(OCP)

热门文章

  1. python变量与常量内容:
  2. 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)...
  3. 软件工程——结对编程第一次作业
  4. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
  5. 模块讲解----shutil模块(copy、压缩、解压)
  6. ThreadLocal相关
  7. awk、变量、运算符、if多分支
  8. 华为OJ平台——放苹果(典型整数划分问题)
  9. Android JNI开发生成.h头文件问题(转)
  10. Microsoft Office企业项目管理(EPM)解决方案