java web乱码问题_如何解决JavaWeb乱码问题
鏈接()中的href標(biāo)簽屬性;
以POST方式提交的表單(
)中的action標(biāo)簽屬性。例如,網(wǎng)頁上不應(yīng)該產(chǎn)生這樣的鏈接:
[xhtml]?view plain?copy
使用者身份驗(yàn)證"
正確的寫法是:
[xhtml]?view plain?copy
使用者身份驗(yàn)證
為此,方案之一可以在JSP網(wǎng)頁上使用腳本化語言進(jìn)行URLEncoding處理。如:
[xhtml]?view plain?copy
">使用者身份驗(yàn)證
request-body的編碼處理
request-body只有在POST提交的方式下才會(huì)產(chǎn)生。request-body的編碼方式由表單的enctype標(biāo)簽屬性指定,同request-line一樣,編碼request-body時(shí)使用的字符集也是當(dāng)前網(wǎng)頁在瀏覽器上顯示時(shí)所使用的字符集。request-body的編碼過程由客戶端瀏覽器自動(dòng)完成,不需要額外的編程處理。
服務(wù)器的處理
相對于用戶端,服務(wù)器端在接收到HTTP請求時(shí)提供了兩種處理請求數(shù)據(jù)的方式:自動(dòng)處理與不處理。
服務(wù)器一般會(huì)自動(dòng)處理application/x-www-form-urlencoded類型的數(shù)據(jù)(包括request-line及request-body中的數(shù)據(jù)),就servlet(Servlet類或JSP網(wǎng)頁)而言,可以通過request對象的getParameter()或getParameterValues()取得這些數(shù)據(jù)。對于除此以外的其它MIME類型的數(shù)據(jù),HTTP服務(wù)器則是將處理的過程直接交到了與HTTP請求相對應(yīng)的servlet(Servlet類或JSP網(wǎng)頁)身上。
例如用戶端有以下表單被提交:
[xhtml]?view plain?copy
表單提交時(shí)經(jīng)服務(wù)器端自動(dòng)處理后與checkUser.html相對應(yīng)的servlet(Servlet類或JSP網(wǎng)頁)可以通過下面的方式取得數(shù)據(jù):
[java]?view plain?copy
String?opt?=?request.getParameter("opt");
String[]?users?=?request.getParameterValues("username");
默認(rèn)情況下,服務(wù)器對于接收到的application/x-www-form-urlencoded類型數(shù)據(jù)進(jìn)行字符集為ISO-8859-1的URLDecoding處理,經(jīng)過處理之后的字符串內(nèi)碼為ISO-8859-1。對于沒有附加任何設(shè)置的HTTP服務(wù)器而言,我們的servlet在取得數(shù)據(jù)之后必須進(jìn)行相應(yīng)的解碼處理,生成內(nèi)碼為UTF-16(unicode)的字符串。
例如對于用戶端請求數(shù)據(jù)中以UTF-8字符集進(jìn)行URLEncoding的數(shù)據(jù),servlet需要進(jìn)行如下方式的解碼:
[java]?view plain?copy
String?opt?=?request.getParameter("opt");
if?(opt!=null?&&?!"".equals(opt))?{
opt?=?new?String(opt.getBytes("ISO-8859-1"),?"UTF-8");
}
為了避免這種額外的編碼/解碼處理,也就是說讓服務(wù)器了解到用戶端在URLEncoding時(shí)所使用的字符集,從而直接進(jìn)行相應(yīng)字符集的URLDecoding處理,不同的HTTP服務(wù)器提供了不同的解決方案。
以Tomcat為例,Tomcat自動(dòng)解碼request-line的處理方式由Tomcat的配置文件server.xml指定。在server.xml中的Connector標(biāo)簽中提供了URIEncoding標(biāo)簽屬性,只要為其指定解碼用的字符集,Tomcat就會(huì)自動(dòng)解碼request-line中經(jīng)過application/x-www-form-urlencoded編碼處理的數(shù)據(jù)。例如:
URIEncoding="UTF-8" redirectPort="8443"/>
Tomcat自動(dòng)解碼request-body的處理方式是設(shè)置request的characterEncoding值。如:
request.setCharacterEncoding("UTF-8");
但是這一操作必須提前在filter中完成,在servlet中使用此方法已經(jīng)不起作用了。filter的例子如下:
[java]?view plain?copy
import?java.io.IOException;
import?javax.servlet.Filter;
import?javax.servlet.FilterChain;
import?javax.servlet.FilterConfig;
import?javax.servlet.ServletException;
import?javax.servlet.ServletRequest;
import?javax.servlet.ServletResponse;
public?class?CharacterEncodingFilter?implements?Filter?{
private?String?encoding;
public?CharacterEncodingFilter()?{
encoding?=?null;
}
public?void?destroy()?{
encoding?=?null;
}
public?void?doFilter(ServletRequest?request,?ServletResponse?response,
FilterChain?chain)?throws?IOException,?ServletException?{
request.setCharacterEncoding(encoding);
chain.doFilter(request,?response);
}
public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
encoding?=?filterConfig.getInitParameter("encoding");
if?(encoding?==?null?||?"".equals(encoding))?{
encoding?=?"UTF-8";
}
}
}
我們可以在web.xml使用這個(gè)filter。web.xml的相應(yīng)配置如下:
[xhtml]?view plain?copy
Character?Encoding?Filter
CharacterEncodingFilter
encoding
UTF-8
Character?Encoding?Filter
/*
通過上述兩種方式的預(yù)處理,在servlet中取出的數(shù)據(jù)可以不必進(jìn)行ISO-8859-1解碼而直接使用。
字符集的選擇
在處理application/x-www-form-urlencoded類型的數(shù)據(jù)過程中,需要注意的另一個(gè)問題是字符集的選擇問題。如上所述,不論是request-line還是request-body,其URLEncoding所使用的字符集都是當(dāng)前網(wǎng)頁在瀏覽器上顯示時(shí)所使用的字符集。而這個(gè)信息又是HTTP服務(wù)器端生成HTML網(wǎng)頁時(shí),在HTTP響應(yīng)中提供的。
當(dāng)HTTP服務(wù)器接收到一個(gè)HTTP請求時(shí),服務(wù)器總是需要向用戶端發(fā)送一個(gè)HTTP響應(yīng)。HTTP響應(yīng)數(shù)據(jù)與HTTP請求數(shù)據(jù)格式相同,同樣由以下幾個(gè)部分組成:
[]
下面描述的是請求一個(gè)HTML網(wǎng)頁數(shù)據(jù)時(shí)服務(wù)器的響應(yīng)信息:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 265
Date: Thu, 17 Dec 2009 05:20:36 GMT
testHello World
[End]
其中headers的Content-Type指定了數(shù)據(jù)流的數(shù)據(jù)格式以及顯示用的字符集。這一指標(biāo)可以通過以下幾種方式指定:
1. HTML網(wǎng)頁
在HTML網(wǎng)頁的
中存在多個(gè)標(biāo)簽,其中可以設(shè)置Content-Type。例如:2. JSP網(wǎng)頁
JSP網(wǎng)頁中,除了標(biāo)簽之外,還需要在JSP網(wǎng)頁頭部設(shè)置如下代碼:
3. Servlet類
如果要在Servlet類中通過response向用戶端傳送HTML數(shù)據(jù),需要在傳送前指定Content-Type。代碼如下:
response.setContentType("text/html;charset=UTF-8");
通過上述三種方式,可以確保響應(yīng)數(shù)據(jù)傳送到用戶端瀏覽器時(shí),瀏覽器使用正確解碼方式和字符集顯示其內(nèi)容。
結(jié)束語
總之,Content-Type是聯(lián)系用戶端與服務(wù)器端的紐帶,通過這一指標(biāo),雙方得以對相關(guān)的數(shù)據(jù)進(jìn)行正確的編碼與解碼。只要了解了Content-Type的作用以及使用方法,亂碼問題就會(huì)迎刃而解。
總結(jié)
以上是生活随笔為你收集整理的java web乱码问题_如何解决JavaWeb乱码问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017好听的男宝宝名字大全
- 下一篇: java arraylist和list_