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