javaweb 解决请求相应的乱码问题
生活随笔
收集整理的這篇文章主要介紹了
javaweb 解决请求相应的乱码问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在學(xué)習(xí)javaweb過(guò)程中由于軟件設(shè)計(jì)者都是外國(guó)人,他們所支持的編碼都是ISO8859-1對(duì)于我們中國(guó)人來(lái)講必須是中文,所以我們一般使用的編碼就是utf-8或者GBK,然而開(kāi)發(fā)工具都是用ISO8859-1編碼,我們用utf-8解碼的話就會(huì)產(chǎn)生亂碼。
解決響應(yīng)亂碼一般都很好解決只需要加下面的一段代碼就可以:
response.setContentType("text/html;charset=utf-8");
然而對(duì)于請(qǐng)求亂碼的解決根據(jù)請(qǐng)求方式的不同解決亂碼的方式也不同,通常我們常用的是POST和GET這兩種方式。對(duì)于POST方式使用下面的代碼就可以解決:
request.setCharacterEncoding("utf-8");
但是對(duì)于get方式的請(qǐng)求方式上面的代碼就不能解決了,get的解決方案是將iso8859-1的編碼通過(guò)反編碼,再通過(guò)utf-8解碼就可以解決:str=new String(str.getByte("iso8859-1"),"utf-8"); 所以在servlet的doGet方法中就可以解決亂碼問(wèn)題(POST提交方式): <span style="white-space:pre"> </span>public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");}但是在這里就存在一個(gè)問(wèn)題,每創(chuàng)建servlet都需要加上這樣一段代碼,還需要知道是POST提交還是GET提交,這樣就顯得很繁瑣,需要解決這個(gè)問(wèn)題就要用到web開(kāi)發(fā)中另一個(gè)重要的知識(shí)點(diǎn)-過(guò)濾器。 Filter是Servlet技術(shù)中最實(shí)用的技術(shù),WEB開(kāi)發(fā)人員通過(guò)Filter技術(shù),對(duì)web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問(wèn)控制、過(guò)濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。 開(kāi)發(fā)一個(gè)Filter分兩個(gè)步驟: 一、寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)特定的接口Filter; 二、在web.xml文件中注冊(cè)這個(gè)Filter。<span style="white-space:pre"> </span><filter><description>全局編碼過(guò)濾器</description><filter-name>EncodingFilter</filter-name><filter-class>com.ruijie.filter.EncodingFilter</filter-class><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping> 在實(shí)現(xiàn)的類(lèi)中處理亂碼,當(dāng)所有的資源訪問(wèn)時(shí)都會(huì)通過(guò)這個(gè)過(guò)濾器過(guò)濾,從而達(dá)到解決亂碼的目的。<span style="white-space:pre"> </span>public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {response.setContentType("text/html;charset="+encode); //解決響應(yīng)亂碼chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);}上文也說(shuō)了在解決亂碼過(guò)程中g(shù)et方式提交的方式是需要主要解決的,在獲取參數(shù)過(guò)程中通常是通過(guò)以下三個(gè)方法獲取:
<span style="white-space:pre"> </span>getParameterMap()getParameterValues(String name)getParameter(String name)
所以問(wèn)題就轉(zhuǎn)移到解決這三個(gè)方法的亂碼問(wèn)題就可以解決get方式的亂碼問(wèn)題。解決方案是將ServletRequest進(jìn)行改造成MyHttpServletRequest,可以通過(guò)兩種方式進(jìn)行改造一種是裝飾模式,一種是動(dòng)態(tài)代理;由于為我們提供了HttpServletRequestWrapper,所以在這里我們使用裝飾者模式更加方便<span style="white-space:pre"> </span>class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request = null;private boolean isNotEncode = true;public MyHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic Map getParameterMap() {try{if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交request.setCharacterEncoding(encode);return request.getParameterMap();}else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交Map<String,String[]> map = request.getParameterMap();if(isNotEncode){//只能在第一次解決亂碼for(Map.Entry<String, String[]> entry : map.entrySet()){String [] vs = entry.getValue();for(int i=0;i<vs.length;i++){vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);}}isNotEncode = false;//設(shè)置為false,第二次就不會(huì)再進(jìn)這個(gè)代碼塊了}return map;}else{return request.getParameterMap();}}catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}@Overridepublic String[] getParameterValues(String name) {return (String[]) getParameterMap().get(name);}@Overridepublic String getParameter(String name) {return getParameterValues(name) == null ? null : getParameterValues(name)[0];}}
點(diǎn)擊下載源碼
總結(jié)
以上是生活随笔為你收集整理的javaweb 解决请求相应的乱码问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaWeb生成图片验证码
- 下一篇: 别克君威21款后视镜换一个整套壳需要多少