最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot參數(shù)傳中文亂碼的解決方案

 更新時(shí)間:2021年03月24日 09:21:30   作者:linyb極客之路  
這篇文章主要介紹了springboot參數(shù)傳中文亂碼的解決方案,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下

前言

本文案例來自業(yè)務(wù)部門的一個(gè)業(yè)務(wù)場景。他們的業(yè)務(wù)場景是他們部門研發(fā)了一個(gè)微服務(wù)上下文透傳組件,其透傳原理也挺簡單的,就是通過springboot攔截器把請求參數(shù)塞進(jìn)threadlocal,然后下游通過threadlocal取到值,服務(wù)之間進(jìn)行feign調(diào)用時(shí),再把threadlocal的參數(shù)塞到header頭里面。這個(gè)組件一直用得好好的,突然有一天因?yàn)閭鞯膮?shù)值是中文,導(dǎo)致亂碼。他們通過嘗試下面的各種方案,都無法解決。最后就讓我們部門排查處理。

業(yè)務(wù)部門的實(shí)現(xiàn)思路

他們一開始的思路方向是參數(shù)編碼不一致導(dǎo)致中文亂碼。于是他們就朝這個(gè)方向努力著,于是就有了如下方案

方案一:

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

這個(gè)是常用解決字符串中文亂碼的方法之一

方案二:編寫字符編碼過濾器

@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() {
 }
}

然后啟動(dòng)類上加上@ServletComponentScan。@WebFilter是servlet3.0才有的注解。當(dāng)然這個(gè)過濾器你還可以這么寫

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() {
 }
}

然后啟動(dòng)類上加上@ServletComponentScan。@WebFilter是servlet3.0才有的注解。當(dāng)然這個(gè)過濾器你還可以這么寫

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() {
 }
}

寫個(gè)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

方案四:寫個(gè)StringHttpMessageConverter

百度來的基本上都是長這樣。不過在spring5版本W(wǎng)ebMvcConfigurerAdapter這個(gè)類已經(jīng)過時(shí)。其替代方式是實(shí)現(xiàn)WebMvcConfigurer接口或者繼承WebMvcConfigurationSupport。不過如果使用WebMvcConfigurationSupport,則會(huì)使springboot的mvc自動(dòng)裝配失效。失效的原因是

拓展一點(diǎn)小知識,加上@EnableWebMvc同樣也會(huì)springboot的mvc自動(dòng)裝配失效。其原因是

org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration這個(gè)配置類繼承WebMvcConfigurationSupport

介紹那么多種方案,并沒有解決按例的問題。那問題點(diǎn)出在哪里?前邊案例我們提到過,在feign調(diào)用時(shí),會(huì)把threadlocal的參數(shù)塞到header里面。真正亂碼的問題點(diǎn)就在這里,header是不支持中文傳輸?shù)?,如果你硬要傳輸,基本上接收方接到就?#63;??這種看似亂碼的符號

破題關(guān)鍵

在把threadlocal的值塞到header里面時(shí),先做下URLEncoder編碼,形如

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

在接收header參數(shù)時(shí),做下URLDecoder.解碼,形如下

URLDecoder.decode(header中待解碼的參數(shù)值, "UTF-8")

總結(jié)

方向錯(cuò)了,雖然再怎么努力看似也啥沒卵用,不過至少可能會(huì)收獲其他意想不到的東西

以上就是springboot參數(shù)傳中文亂碼的解決方案的詳細(xì)內(nèi)容,更多關(guān)于springboot參數(shù)傳中文亂碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)之HashMap源碼深入分析

    Java數(shù)據(jù)結(jié)構(gòu)之HashMap源碼深入分析

    Java HashMap是一種基于哈希表實(shí)現(xiàn)的鍵值對存儲(chǔ)結(jié)構(gòu),可以實(shí)現(xiàn)快速的數(shù)據(jù)查找和存儲(chǔ)。它是線程不安全的,但在單線程環(huán)境中運(yùn)行效率高,被廣泛應(yīng)用于Java開發(fā)中
    2023-04-04
  • Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個(gè)注入的Bean

    Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個(gè)注入的Bean

    這篇文章主要介紹了Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個(gè)注入的Bean問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • IDEA無法使用Git?Pull的問題

    IDEA無法使用Git?Pull的問題

    本文主要介紹了IDEA無法使用Git?Pull的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • SpringBoot集成FTP與SFTP連接池流程

    SpringBoot集成FTP與SFTP連接池流程

    在項(xiàng)目開發(fā)中,一般文件存儲(chǔ)很少再使用SFTP服務(wù),但是也不排除合作伙伴使用SFTP來存儲(chǔ)項(xiàng)目中的文件或者通過SFTP來實(shí)現(xiàn)文件數(shù)據(jù)的交互,這篇文章主要介紹了SpringBoot集成FTP與SFTP連接池
    2022-12-12
  • SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式

    SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式

    Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式,感興趣的可以了解一下
    2024-01-01
  • Java中token的存儲(chǔ)和獲取實(shí)例代碼

    Java中token的存儲(chǔ)和獲取實(shí)例代碼

    關(guān)于java獲取微信Token驗(yàn)證的問題相信很多人都遇見過,尤其是對剛接觸微信開發(fā)的人來說確實(shí)有點(diǎn)棘手,下面這篇文章主要給大家介紹了關(guān)于Java中token存儲(chǔ)和獲取的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Java連接六類數(shù)據(jù)庫技巧全攻略

    Java連接六類數(shù)據(jù)庫技巧全攻略

    本文主要為大家介紹了Java與Oracle、DB2、Sql Server、Sybase、MySQL、PostgreSQL等數(shù)據(jù)庫連接的方法。
    2015-09-09
  • SpringBoot Starter自定義之創(chuàng)建可復(fù)用的自動(dòng)配置模塊方式

    SpringBoot Starter自定義之創(chuàng)建可復(fù)用的自動(dòng)配置模塊方式

    本文將詳細(xì)介紹如何設(shè)計(jì)和實(shí)現(xiàn)一個(gè)自定義的Spring Boot Starter,幫助讀者掌握這一強(qiáng)大技術(shù),提升代碼復(fù)用性和開發(fā)效率,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • java如何判斷一個(gè)對象是否為空對象

    java如何判斷一個(gè)對象是否為空對象

    本文主要介紹了java如何判斷一個(gè)對象是否為空對象,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解Java的JDBC API的存儲(chǔ)過程與SQL轉(zhuǎn)義語法的使用

    詳解Java的JDBC API的存儲(chǔ)過程與SQL轉(zhuǎn)義語法的使用

    這篇文章主要介紹了詳解Java的JDBC API的存儲(chǔ)過程與SQL轉(zhuǎn)義語法的使用,JDBC是Java用于連接使用各種數(shù)據(jù)庫的API,需要的朋友可以參考下
    2015-12-12

最新評論

麻江县| 罗山县| 明水县| 安仁县| 天台县| 龙门县| 望谟县| 弋阳县| 石棉县| 治县。| 内乡县| 永德县| 渝北区| 庆云县| 桐柏县| 麻城市| 三穗县| 龙井市| 南乐县| 奉化市| 合江县| 玉山县| 临漳县| 拉萨市| 大方县| 阿拉善左旗| 澳门| 温州市| 花莲县| 元谋县| 同江市| 九龙县| 扶余县| 禄丰县| 崇礼县| 安阳市| 新闻| 东兴市| 崇仁县| 内丘县| 普兰店市|