亂碼問題總結(jié).ppt_第1頁
亂碼問題總結(jié).ppt_第2頁
亂碼問題總結(jié).ppt_第3頁
亂碼問題總結(jié).ppt_第4頁
亂碼問題總結(jié).ppt_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、中文亂碼和過濾器,第二章,回顧與作業(yè)點(diǎn)評,Java中生成一個Class對象的方法主要有哪些? Java反射技術(shù)有什么優(yōu)缺點(diǎn)? 代理模式中一般涉及哪三個角色? 靜態(tài)代理和動態(tài)代理的區(qū)別有哪些?,本章任務(wù),使用過濾器解決中文亂碼問題 使用過濾器解決權(quán)限驗(yàn)證問題 使用過濾器進(jìn)行字符替換,本章目標(biāo),能夠解決中文亂碼問題 編碼知識 解決中文亂碼問題 掌握過濾器知識 過濾器及其作用 過濾器運(yùn)行原理 過濾器接口 過濾器的應(yīng)用,字符集與字符編碼,字符集(Character Set) 字符組成的集合,描述并定義了這個集合中可以出現(xiàn)哪些字符 字符編碼(Character Encoding) 字符集中的字符在計(jì)算機(jī)

2、中的二進(jìn)制存儲形式 先有字符集,再有字符編碼 一個字符集可以有多種編碼方式,字符集與字符編碼,ASCII ASCII使用7個比特進(jìn)行字符編碼,最多可以表示的字符數(shù)量為27(128)個 包括大小寫英文字母、數(shù)字、標(biāo)點(diǎn)符號、控制字符等 每個字符用一個字節(jié)表示,每個字節(jié)的最高位為0 字符“A”在用ASCII碼中用2進(jìn)制的“01000001”表示,換算成10進(jìn)制為“65”,字符集與字符編碼,ISO8859-1 ISO8859-1,又稱Latin-1或西歐語言,在ASCII的基礎(chǔ)上,使用8比特編碼,新增一些字符,兼容ASCII 新增的字符主要用來支持部分歐洲國家所使用的語言,例如德語、葡萄牙語和西班牙語

3、等 ISO8859另外定義了14個適用于不同文字的字符集(8859-2到8859-15),均共享0-127的ASCII碼,只是每個字符集都包含了128-255的其他字符 ISO8859-2:中歐語言 ISO8859-3:南歐語言 ISO8859-4:北歐語言 ,字符集與字符編碼,GB2312 1981年,開始使用國家標(biāo)準(zhǔn)信息交換用漢字編碼字符集基本集,簡稱GB2312 GB2312使用雙字節(jié)編碼,包含7445個字符。對漢字分成兩級,一級為3755個常用字,二級為3008個次常用字,還收錄了682個其他字符 GB2312主要應(yīng)用在中國大陸和新加坡,兼容ASCII GBK 在GB2312的基礎(chǔ)上又

4、進(jìn)行了擴(kuò)充。在1995年,推出了漢字內(nèi)碼擴(kuò)展規(guī)范,簡稱GBK GBK收錄了21886個漢字和圖形符號,其中漢字21003個,圖形符號883個,并且向下與GB2312編碼完全兼容,字符集與字符編碼,GB18030 GB18030-2000編碼標(biāo)準(zhǔn)是由信息產(chǎn)業(yè)部和國家質(zhì)量技術(shù)監(jiān)督局在2000年聯(lián)合發(fā)布的 在GBK編碼標(biāo)準(zhǔn)的基礎(chǔ)上進(jìn)行擴(kuò)充,增加了一些新的字符,特別是一些少數(shù)民族使用的字符 主要目的是為了解決一些生、偏、難字的問題 BIG5 BIG5又稱為大五碼,是針對繁體漢字的漢字編碼,目前廣泛應(yīng)用在在臺灣、澳門和香港地區(qū) BIG5也是雙字節(jié)編碼,一共收錄了5401個常用字和7652個次常用字,字符

5、集與字符編碼,Unicode 1991年Unicode把世界上幾十種文字整合在一個字符集中,Unicode中每個字符都有一個唯一的數(shù)字進(jìn)行表示 現(xiàn)在Unicode已被廣泛使用,Java、WindowsXP、和MS Office等軟件內(nèi)部都使用了Unicode作為內(nèi)碼 目前已經(jīng)定義了40000多個不同Unicode字符,剩余的留給將來擴(kuò)展使用。其中20000個字符用于漢字,11000左右個用于韓語音節(jié)。同樣兼容ASCII,字符集與字符編碼,UTF-8 UTF是Unicode/UCS Transformation Format (統(tǒng)一字符集/統(tǒng)一字符編碼轉(zhuǎn)換格式)的縮寫 UTF就是Unicode的

6、一種字符編碼(轉(zhuǎn)換)方法。Unicode組織推薦使用的是UTF-8和UTF-16,UTF-8是一種變長的編碼方式,也是當(dāng)前Unicode最常用的一種字符編碼(轉(zhuǎn)換)方法,字符集與字符編碼,使用Unicode編碼,一個英文字符要用兩個字節(jié),在Internet上,大多數(shù)信息使用英文表示的,如果采用Unicode編碼,將會使數(shù)據(jù)量增加一倍。為了減少存儲和傳輸英文字符數(shù)據(jù)的數(shù)據(jù)量,可以使用UTF-8編碼 因?yàn)橹形淖址腢nicode編碼在0 x0800與0 xffff之間,所以數(shù)據(jù)如果是中文,采用UTF-8編碼,一個中文字符將占用3個字節(jié)空間,數(shù)據(jù)量會增加50%,中文亂碼解決方法,JSP文件的中文亂碼

7、問題 Servlet的中文亂碼問題 表單處理的中文亂碼問題 Struts 2的中文亂碼問題,中文亂碼解決方法,JSP文件的中文亂碼問題 通過瀏覽器調(diào)用JSP頁面,在瀏覽器中所有的中文內(nèi)容出現(xiàn)亂碼 解決方法, 或者 ,中文亂碼解決方法,Servlet的中文亂碼問題 通過瀏覽器調(diào)用Servlet,Servlet在瀏覽器中顯示的內(nèi)容出現(xiàn)亂碼 解決方法:在Servlet使用response對輸出內(nèi)容之前,指定字符類型,response.setContentType(“text/html;charset=utf-8”);,中文亂碼解決方法,POST表單傳遞參數(shù)亂碼 通過JSP頁面、HTML頁面或者Ser

8、vlet中的表單元素提交參數(shù)給對應(yīng)的JSP頁面或者Servlet,而JSP頁面或者Servlet接收的中文參數(shù)值亂碼 解決方法:在接收POST 提交的參數(shù)之前,設(shè)定接收參數(shù)的內(nèi)容使用UTF-8編碼 更好的解決方法,就是使用過濾器技術(shù),在接收參數(shù)之前,設(shè)定傳遞的參數(shù)內(nèi)容的編碼是UTF-8,request.setCharacterEncoding(UTF-8);,中文亂碼解決方法,GET表單傳遞參數(shù)亂碼 可以通過GET方式傳遞表單參數(shù),還可以使用鏈接方式傳遞參數(shù),這種方法本質(zhì)上還是GET方式。如果傳遞參數(shù)的值是中文,也會出現(xiàn)亂碼 解決方法一:修改Tomcat的server.xml文件 解決方法二:

9、程序中進(jìn)行編碼轉(zhuǎn)換處理,String name=request.getParameter(name); byte b=name.getBytes(iso-8859-1); name=new String(b,utf-8); out.println(name);,中文亂碼解決方法,Struts 2的中文亂碼問題 在struts.xml中配置struts.i18n.encoding常量, ,小結(jié),常見的中文字符編碼有哪些,有什么區(qū)別? 如何解決表單提交中的中文亂碼問題?,什么是過濾器,過濾器是駐留在服務(wù)器端的Web組件,它可以截取客戶端和服務(wù)器目標(biāo)資源之間的請求和響應(yīng)信息,并對這些信息進(jìn)行處理 過

10、濾器是請求到達(dá)一個目標(biāo)資源前的預(yù)處理程序,和/或響應(yīng)離開目標(biāo)資源后的后處理程序 利用過濾器可以實(shí)現(xiàn)多種功能,例如編碼轉(zhuǎn)化、數(shù)據(jù)過濾和替換、身份驗(yàn)證、數(shù)據(jù)加密、數(shù)據(jù)壓縮、日志記錄等,過濾器的工作原理,過濾器,過濾器的工作原理,過濾器鏈 對于任意請求和任意響應(yīng)項(xiàng)目中任意過濾器都執(zhí)行過濾操作嗎? 請求與響應(yīng)時(shí)各把過濾器從頭至尾執(zhí)行一遍嗎? 各過濾器的執(zhí)行順序如何指定呢?,過濾器的工作原理,定義過濾器Filter1和Filter2,public class Filter1 implements Filter public void init(FilterConfig arg0) throws Serv

11、letException public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(before filter1); chain.doFilter(request, response); System.out.println(after filter1); public void destroy() ,public class Filter2 implements

12、 Filter public void init(FilterConfig arg0) throws ServletException public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException System.out.println(before filter2); chain.doFilter(request, response); System.out.println(after filter2);

13、 public void destroy() ,過濾器的工作原理,在web.xml中配置過濾器Filter1和Filter2, filter1 cn.jbit.filter.Filter1 filter1 /* filter2 cn.jbit.filter.Filter2 filter2 /* ,過濾器接口,Filter接口 任何一個過濾器必須要實(shí)現(xiàn)javax.servlet.Filter接口 Filter 接口包含以下方法,Filter 接口,init(),doFilter(),destroy(),過濾器接口,Filter接口 init(FilterConfig filterConfig)

14、Web容器調(diào)用該方法來初始化過濾器 容器在調(diào)用該方法時(shí),向過濾器傳遞FilterConfig對象 利用該對象可以得到ServletContext對象,以及在web.xml中配置的過濾器初始化參數(shù) doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 可以調(diào)用chain.doFilter()將請求傳給下一個過濾器或目標(biāo)資源 可以直接向客戶端返回響應(yīng)信息 可以利用RequestDispatcher的forwrard()和include()以及HttpServletResponse的sendRedi

15、rect()將請求轉(zhuǎn)向其他資源 destroy() 銷毀過濾器,可以在這里釋放使用完的資源,例如設(shè)置過濾器中FilterConfig為null,過濾器接口,FilterChain 接口 FilterChain 接口用于調(diào)用過濾器鏈的一系列過濾器 過濾鏈,在Web應(yīng) 用程序中所有的過濾器會構(gòu)成一個鏈狀,符合過濾條件的程序?qū)鶕?jù)定義的順序執(zhí)行所有鏈中的過濾器 這個順序的設(shè)置是在web.xml中完成的,其中的先后順序指定了這個順序 調(diào)用FilterChain的唯一方法doFilter(ServletRequest, SerletResponse) 就可以傳遞到鏈中的下一個過濾器,過濾器接口,Fil

16、terConfig接口 在初始化過程中,容器使用 FilterConfig 將信息傳遞給過濾器 FilterConfig 接口包含以下方法,getFilterName(),getInitParameter(),getInitParameterNames(),getServletContext(),FilterConfig,開發(fā)字符編碼過濾器,使用Servlet進(jìn)行登錄驗(yàn)證,無法正確識別和顯示中文 可以在Servlet中通過使用以下語句進(jìn)行處理,但作用僅限于當(dāng)前Servlet 通過Filter進(jìn)行處理,可以作用于多個Servlet,request.setCharacterEncoding(“ut

17、f-8) ; response.setContentType(text/html;charset=utf-8);,開發(fā)字符編碼過濾器,public class EncodingFilter implements Filter FilterConfig filterConfig; String encoding; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException String contentTy

18、pe = text/html;charset=+encoding; response.setContentType(contentType); request.setCharacterEncoding(encoding); chain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException this.filterConfig = filterConfig; encoding = filterConfig.getInitParameter(encoding);

19、 if (encoding = null) encoding = gbk; public void destroy() filterConfig = null; ,開發(fā)字符編碼過濾器,讀取初始化參數(shù),進(jìn)行編碼處理,開發(fā)字符編碼過濾器, encoding cn.jbit.filter.EncodingFilter encoding utf-8 encoding /* ,配置字符編碼過濾器,指定初始化參數(shù),提高靈活性,練習(xí)開發(fā)字符編碼過濾器,需求說明: 開發(fā)字符編碼過濾器,解決中文亂碼問題 實(shí)現(xiàn)步驟 參考本專題實(shí)現(xiàn)步驟和代碼,完成時(shí)間:20分鐘,共性問題集中講解,常見調(diào)試問題及解決辦法 代碼規(guī)范問

20、題,共性問題集中講解,開發(fā)權(quán)限控制過濾器,用戶必須登錄才能訪問網(wǎng)站資源,如果直接訪問網(wǎng)站資源將重定向到登陸頁面,從而提高網(wǎng)站安全性 使用過濾器進(jìn)行權(quán)限驗(yàn)證 如果訪問登錄頁面,或者提交登錄,則不進(jìn)行過濾 其他情況都要判斷是否登錄,如果沒有登錄則重定向到登錄頁面,開發(fā)權(quán)限控制過濾器,public class VerifyFilter implements Filter public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, Servle

21、tException HttpServletRequest httpreq = (HttpServletRequest) request; HttpServletResponse httpresp = (HttpServletResponse) response; HttpSession session = httpreq.getSession(); String path1 = httpreq.getRequestURI(); int n1 = path1.indexOf(/login/login.jsp); String path2 = httpreq.getServletPath();

22、int n2 = path2.indexOf(servlet/Login); if (n1 != -1 | n2 != -1) chain.doFilter(request, response); else String username = (String) session.getAttribute(username); if (username = null) httpresp.sendRedirect(/filter/login/login.jsp); ,開發(fā)權(quán)限控制過濾器,開發(fā)權(quán)限控制過濾器, Verify cn.jbit.filter.VerifyFilter Verify /* ,

23、配置權(quán)限控制過濾器,練習(xí)開發(fā)權(quán)限控制過濾器,需求說明: 開發(fā)權(quán)限控制過濾器,使用戶必須登錄才可以訪問網(wǎng)站資源,否則將重定向到登陸頁面 實(shí)現(xiàn)步驟 參考本專題實(shí)現(xiàn)步驟和代碼,完成時(shí)間:20分鐘,共性問題集中講解,常見調(diào)試問題及解決辦法 代碼規(guī)范問題,共性問題集中講解,開發(fā)字符替換過濾器,需要對輸入的中“” 、“”、“ ”等字符進(jìn)行替換??梢允褂眠^濾器完成該功能,HttpServletRequest類并沒有提供對請求信息進(jìn)行修改的setXXX()方法,所以雖然過濾器可以截取到請求數(shù)據(jù)卻無法修改 雖然不能直接改變請求對象的狀態(tài),但可以利用請求的包裝類(wrapper)來間接改變請求數(shù)據(jù) 請求包裝類的構(gòu)

24、造方法中接受真正的請求對象,然后利用該對象的方法完成自己需要實(shí)現(xiàn)的方法 有了包裝類,要改變請求信息就非常簡單了,只需要編寫一個包裝類的子類,然后覆蓋想要修改的方法即可 在過濾器的doFilter方法中,需要構(gòu)造一個包裝類的子類的實(shí)例,并作為參數(shù)傳遞給Chain.doChain()方法,開發(fā)字符替換過濾器,開發(fā)字符替換過濾器,public class MyRequestWrapper extends HttpServletRequestWrapper public String getParameter(String str) String param = super.getParameter(str); return t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論