日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java web乱码问题_如何解决JavaWeb乱码问题

發(fā)布時(shí)間:2023/11/27 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java web乱码问题_如何解决JavaWeb乱码问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接()中的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

test

Hello 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。