国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

2021-07-30 11:28江南一點(diǎn)雨 Java教程

這篇文章主要給大家介紹了關(guān)于JavaWeb亂碼問(wèn)題的終極解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaWeb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

經(jīng)常有讀者在公眾號(hào)上問(wèn) javaweb 亂碼的問(wèn)題,昨天又有一個(gè)小伙伴問(wèn)及此事,其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,但是想要說(shuō)清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因都不一樣,給每位小伙伴都把亂碼的原因講一遍也挺費(fèi)時(shí)間的,因此,松哥今天決定寫(xiě)一篇文章,和大伙好好捋捋 javaweb 中的亂碼問(wèn)題。

對(duì)于一些老司機(jī)而言,其實(shí)并不太容易遇到亂碼問(wèn)題,但是對(duì)于一些新手來(lái)說(shuō),亂碼幾乎是家常便飯,而且每當(dāng)亂碼時(shí),網(wǎng)上搜了一大堆解決方案,發(fā)現(xiàn)自己的問(wèn)題還是沒(méi)能解決,其實(shí)這就是平時(shí)研究代碼不求甚解導(dǎo)致的,亂碼問(wèn)題,也要去分析,然后才能對(duì)癥下藥,才能藥到病除。

整體思路

首先出現(xiàn)亂碼之后,要先去確認(rèn)亂碼的地方,當(dāng)一個(gè)網(wǎng)頁(yè)上出現(xiàn)亂碼,有可能是瀏覽器顯示問(wèn)題,也有可能是 java 編碼問(wèn)題,也有可能數(shù)據(jù)庫(kù)中的數(shù)據(jù)本身就是亂碼的,所以我們要做的第一件事就是確認(rèn)亂碼發(fā)生的位置,縮小 bug 范圍,通過(guò)打印日志或者 debug 首先去確認(rèn)亂碼發(fā)生的位置,然后再去進(jìn)一步解決,一般來(lái)說(shuō),亂碼的原因大致上可以分為兩類(lèi):

  • 請(qǐng)求亂碼
  • 響應(yīng)亂碼

請(qǐng)求亂碼,可能是因?yàn)閰?shù)放在 url 地址中亂碼,也有可能是參數(shù)放在請(qǐng)求體中亂碼,不同傳參方案也對(duì)應(yīng)了不同的亂碼解決方案。如果是響應(yīng)亂碼,那么原因就會(huì)比較多了,一般來(lái)說(shuō),有如下幾種可能的原因:

  • 數(shù)據(jù)庫(kù)本身亂碼
  • 數(shù)據(jù)在 java 代碼中亂碼
  • 數(shù)據(jù)在瀏覽器顯示的時(shí)候亂碼
  • 數(shù)據(jù)在從 java 應(yīng)用傳到數(shù)據(jù)庫(kù)的過(guò)程中亂碼

對(duì)于不同的亂碼原因,會(huì)有不同的解決方案,對(duì)癥下藥,才能藥到病除,所以當(dāng)出現(xiàn)亂碼時(shí),大家要做的第一件事就是分析亂碼發(fā)生的原因,找到原因了,才能找到解決方案。

基本原則

發(fā)生亂碼是因?yàn)楦髯跃幋a不同導(dǎo)致的,所以,大家首先要有一個(gè)良好的開(kāi)發(fā)習(xí)慣,項(xiàng)目編碼,文件編碼都要統(tǒng)一起來(lái),松哥有個(gè)同事就因?yàn)?freemarker 亂碼,找了半天沒(méi)找到原因,后來(lái)在松哥建議下修改了項(xiàng)目編碼,亂碼問(wèn)題才解決了,一般來(lái)說(shuō),公司制度稍微成熟一些,都會(huì)對(duì)項(xiàng)目編碼,文件編碼有硬性規(guī)定的。在eclipse 中,設(shè)置項(xiàng)目編碼方式如下(工程的編碼要提前設(shè)置,如果項(xiàng)目已經(jīng)開(kāi)發(fā)一半再去設(shè)置,已有的中文就會(huì)亂碼):

window->preferences->general

JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

然后對(duì)于 jsp 文件也需要提前設(shè)置好編碼方式,如下:

JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

這是在 eclipse 中設(shè)置文件編碼,如果是在 intellij idea中,則不需要設(shè)置jsp文件編碼,因?yàn)槟J(rèn)就是 utf-8,只需要提前設(shè)置下工程編碼即可:

JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

除了開(kāi)發(fā)工具的編碼,數(shù)據(jù)庫(kù)的編碼也要統(tǒng)一,一般來(lái)說(shuō),主要是設(shè)置一下數(shù)據(jù)庫(kù)的編碼和數(shù)據(jù)表的編碼,如下:

設(shè)置數(shù)據(jù)庫(kù)編碼:

?
1
create database `vhr` default character set utf8;

設(shè)置數(shù)據(jù)表編碼:

?
1
2
3
4
5
6
drop table if exists `adjustsalary`;
create table `adjustsalary` (
 `id` int(11) not null auto_increment,
 `eid` int(11) default null,
 primary key (`id`),
) engine=innodb default charset=utf8;

這些是準(zhǔn)備工作,這些工作做好了,還是有可能會(huì)遇到亂碼問(wèn)題,接下來(lái)我們就具體問(wèn)題具體分析。

請(qǐng)求亂碼

請(qǐng)求亂碼,就是說(shuō)數(shù)據(jù)在瀏覽器中顯示是正常的,但是傳到 java 后端之后,就亂碼了,這種亂碼一般來(lái)說(shuō),分為兩種:

  • 參數(shù)放在 url 地址中導(dǎo)致的亂碼
  • 參數(shù)放在請(qǐng)求體中導(dǎo)致的亂碼

兩種亂碼原因,對(duì)應(yīng)了兩種不同的解決方案。分別來(lái)看。

url 地址中的參數(shù)亂碼

這種亂碼主要發(fā)生在 get 請(qǐng)求中,因?yàn)樵?get 請(qǐng)求中我們一般通過(guò) url 來(lái)傳遞參數(shù),這個(gè)問(wèn)題可以在代碼中解決,但是太過(guò)于麻煩,因此一般我們直接在tomcat配置中解決,修改 tomcat的conf/server.xml 文件,修改 url 編碼格式,如下:

JavaWeb亂碼問(wèn)題的終極解決方案(推薦)

這樣就可以搞定 url 地址中的參數(shù)亂碼。

請(qǐng)求體中的參數(shù)亂碼

請(qǐng)求體中的參數(shù)亂碼,我們可以在解析參數(shù)之前通過(guò)設(shè)置 httpservletrequest 的編碼來(lái)解決,如下:

?
1
request.setcharacterencoding("utf-8");

但是一樣也太過(guò)于麻煩,所以如果是普通的 servlet/jsp 項(xiàng)目,我們就可以直接定義一個(gè)過(guò)濾器來(lái)處理,如下:

?
1
2
3
4
5
6
7
public class encodingfilter implements filter {
 @override
 public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception {
  request.setcharacterencoding("utf-8");
  chain.dofilter(request, response);
 }
}

過(guò)濾器配置:

?
1
2
3
4
5
6
7
8
<filter>
 <filter-name>encodingfilter</filter-name>
 <filter-class>org.sang.filter.encodingfilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>encodingfilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

在工程編碼和jsp/html編碼都沒(méi)問(wèn)題的情況下,請(qǐng)求亂碼基本上就是這兩種情況。

響應(yīng)亂碼

如果在瀏覽器上加載頁(yè)面看到了亂碼,大家首先要確認(rèn)在從服務(wù)端往瀏覽器寫(xiě)數(shù)據(jù)的前一刻,這個(gè)數(shù)據(jù)還沒(méi)有亂碼(即數(shù)據(jù)庫(kù)中查詢出來(lái)的數(shù)據(jù)是ok的,沒(méi)有發(fā)生亂碼的問(wèn)題),那么對(duì)于這種亂碼,我們只需要設(shè)置響應(yīng)數(shù)據(jù)的 contenttype 就可以了,如下:

?
1
response.setcontenttype("text/html;charset=utf-8");

如果從數(shù)據(jù)庫(kù)中查詢出來(lái)的數(shù)據(jù)就是亂碼的,那么就需要去確認(rèn)數(shù)據(jù)庫(kù)中的編碼是否 ok 。

框架處理

前面提到的方案,都是在 servlet/jsp 項(xiàng)目中我們可以采用的方案,在 ssm 框架中當(dāng)然也可以使用,但是,springmvc 框架本身也提供了一個(gè)過(guò)濾器,我們可以借用這個(gè)過(guò)濾器更加高效的解決響應(yīng)亂碼問(wèn)題,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<filter>
 <filter-name>encoding</filter-name>
 <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>utf-8</param-value>
 </init-param>
 <init-param>
  <param-name>forcerequestencoding</param-name>
  <param-value>true</param-value>
 </init-param>
 <init-param>
  <param-name>forceresponseencoding</param-name>
  <param-value>true</param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>encoding</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

當(dāng)然,上面這段配置并不能代替 tomcat 中 conf/server.xml 中的編碼配置,如果是在 spring boot 中,配置可以更加簡(jiǎn)單,只需要在 application.properties 中添加如下配置即可:

?
1
2
3
server.tomcat.uri-encoding=utf-8
spring.http.encoding.force-request=true
spring.http.encoding.force-response=true

其他亂碼

其他亂碼主要是指使用一些第三方框架導(dǎo)致的亂碼,例如使用 alibaba 的 fastjson,開(kāi)發(fā)者就需要在配置 httpmessageconverter 時(shí)指定編碼格式,否則就有可能出現(xiàn)亂碼,這種第三方框架的亂碼松哥沒(méi)法窮舉,大伙在使用時(shí)需要注意看官方文檔,fastjson 的 httpmessageconverter 配置如下:

?
1
2
3
4
5
6
7
8
9
@bean
fastjsonhttpmessageconverter fastjsonhttpmessageconverter() {
 fastjsonhttpmessageconverter converter = new fastjsonhttpmessageconverter();
 fastjsonconfig config = new fastjsonconfig();
 config.setcharset(charset.forname("utf-8"));
 converter.setfastjsonconfig(config);
 converter.setdefaultcharset(charset.forname("utf-8"));
 return converter;
}

一個(gè)隱蔽的亂碼

除了前面介紹的這幾種亂碼之外,還有一個(gè)比較隱蔽的亂碼,容易被很多初學(xué)者忽略的地方,就是數(shù)據(jù)在從 java 應(yīng)用傳遞到 mysql 的過(guò)程中,發(fā)生了亂碼,這種問(wèn)題一般在 windows 上不易發(fā)生,如果數(shù)據(jù)庫(kù)裝在 linux 上,則這個(gè)問(wèn)題就很容易發(fā)生,數(shù)據(jù)在代碼中命名沒(méi)有亂碼,存到 mysql 上就亂碼了,但是如果直接使用 navicat 等工具往 mysql 上存儲(chǔ)數(shù)據(jù),又不會(huì)亂碼,或者 mysql 中數(shù)據(jù)沒(méi)有亂碼,但是用 java 查詢出來(lái)就亂碼了,這種都是數(shù)據(jù)在 應(yīng)用 和 數(shù)據(jù)庫(kù) 之間傳遞時(shí)發(fā)生了亂碼,解決方式很簡(jiǎn)單,在數(shù)據(jù)庫(kù)連接地址上指定編碼即可,如下:

?
1
db.url=jdbc:mysql:///yuetong?useunicode=true&characterencoding=utf-8

大致就這些,還有一些非常偶爾的情況可能會(huì)用到 @requestmapping 注解中的 produces 屬性,在這里指定數(shù)據(jù)類(lèi)型即可。

好了,差不多就這些,下次有人問(wèn)你為啥我的又亂碼了,直接把這篇文章甩給他。大伙有什么解決亂碼的獨(dú)門(mén)密器也可以一起來(lái)討論。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/lenve/p/10675044.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 正在播放国产精品 | 日日夜夜伊人 | 欧美成人精品一区 | 91视频免费看片 | 四虎最新网站 | 日韩欧美精品一区二区三区 | 一区二区三区动漫 | 欧美午夜视频 | 久久精品夜夜夜夜夜久久 | 久久99精品久久久久久噜噜 | 久草 在线 | 懂色一区二区三区av片 | 久久久久久91 | 久久久美女视频 | 日韩欧美一区二区三区 | 免费观看一区二区三区毛片 | 国产成人精品一区二区三区网站观看 | 成年人免费在线播放视频 | 亚洲xxxx3d| 久久一级淫片 | 日本一区二区三区精品视频 | 99国产精品99久久久久久 | 久久精品亚洲精品国产欧美kt∨ | 婷婷久| 91免费看网站 | 一区二区三区精品视频 | 亚洲二区在线播放 | 久久久久久网站 | 成人黄色在线 | 成人福利电影在线观看 | 免费一级a毛片免费观看 | 亚洲国产精品一区二区久久,亚洲午夜 | 亚洲电影天堂在线观看 | 在线中文字幕视频 | 亚洲国产精品欧美一二99 | 国产精品99久久久久久动医院 | 欧美一区二区三区在线观看 | 精品久久久久久亚洲精品 | 日韩欧美视频 | 成人免费福利 | 亚洲人一区二区 |