亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:71日期:2023-03-19 18:57:19
前言

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

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

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

方案一:

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

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

方案二:編寫字符編碼過(guò)濾器

@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è)過(guò)濾器你還可以這么寫

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è)過(guò)濾器你還可以這么寫

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: trueserver: tomcat: uri-encoding: UTF-8方案四:寫個(gè)StringHttpMessageConverter

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

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

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

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

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

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

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

介紹那么多種方案,并沒(méi)有解決按例的問(wèn)題。那問(wèn)題點(diǎn)出在哪里?前邊案例我們提到過(guò),在feign調(diào)用時(shí),會(huì)把threadlocal的參數(shù)塞到header里面。真正亂碼的問(wèn)題點(diǎn)就在這里,header是不支持中文傳輸?shù)模绻阌惨獋鬏敚旧辖邮辗浇拥骄褪?#63;??這種看似亂碼的符號(hào)

破題關(guān)鍵

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

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

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

URLDecoder.decode(header中待解碼的參數(shù)值, 'UTF-8')總結(jié)

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

以上就是springboot參數(shù)傳中文亂碼的解決方案的詳細(xì)內(nèi)容,更多關(guān)于springboot參數(shù)傳中文亂碼的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 日韩欧美黄色 | 国产亚洲精品第一区在线观看 | 大学生gayxxxx chinese| 美日毛片 | 欧美三级欧美一级 | 黄视频福利 | 91精品一区国产高清在线 | 国产亚洲亚洲精品777 | 欧美精品久久 | 欧美色图自拍 | 不卡福利视频 | 国产免费专区 | 久久精品乱子伦免费 | 一级黄色片美国 | 在线观看www妖精免费福利视频 | 成年人毛片 | 婷婷在线网 | 日韩经典视频 | 日韩在线一区高清在线 | 欧美日韩国产手机在线观看视频 | 成人亚洲视频在线观看 | 特级毛片永久久免费观看 | 国产综合久久久久影院 | 亚州三级视频 | 91最新视频在线观看 | 在线看片黄色 | 精品小视频在线观看 | 中国精品 | 日韩第四页 | 国产亚洲精品美女2020久久 | 国产永久在线 | 亚洲毛片基地4455ww | 国产逼逼视频 | 喷水网站 | 欧美黑人白人bbw | 瑟瑟久久 | 男女午夜爱爱久久无遮挡 | 免费黄色在线视频 | 国产美女福利 | 日本黄区免费视频观看 | 国产一区二区日韩欧美在线 |