javaweb 解决请求相应的乱码问题
生活随笔
收集整理的這篇文章主要介紹了
javaweb 解决请求相应的乱码问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在學習javaweb過程中由于軟件設計者都是外國人,他們所支持的編碼都是ISO8859-1對于我們中國人來講必須是中文,所以我們一般使用的編碼就是utf-8或者GBK,然而開發工具都是用ISO8859-1編碼,我們用utf-8解碼的話就會產生亂碼。
解決響應亂碼一般都很好解決只需要加下面的一段代碼就可以:
response.setContentType("text/html;charset=utf-8");
然而對于請求亂碼的解決根據請求方式的不同解決亂碼的方式也不同,通常我們常用的是POST和GET這兩種方式。對于POST方式使用下面的代碼就可以解決:
request.setCharacterEncoding("utf-8");
但是對于get方式的請求方式上面的代碼就不能解決了,get的解決方案是將iso8859-1的編碼通過反編碼,再通過utf-8解碼就可以解決:str=new String(str.getByte("iso8859-1"),"utf-8"); 所以在servlet的doGet方法中就可以解決亂碼問題(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");}但是在這里就存在一個問題,每創建servlet都需要加上這樣一段代碼,還需要知道是POST提交還是GET提交,這樣就顯得很繁瑣,需要解決這個問題就要用到web開發中另一個重要的知識點-過濾器。 Filter是Servlet技術中最實用的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。 開發一個Filter分兩個步驟: 一、寫一個類實現特定的接口Filter; 二、在web.xml文件中注冊這個Filter。<span style="white-space:pre"> </span><filter><description>全局編碼過濾器</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> 在實現的類中處理亂碼,當所有的資源訪問時都會通過這個過濾器過濾,從而達到解決亂碼的目的。<span style="white-space:pre"> </span>public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {response.setContentType("text/html;charset="+encode); //解決響應亂碼chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);}上文也說了在解決亂碼過程中get方式提交的方式是需要主要解決的,在獲取參數過程中通常是通過以下三個方法獲取:
<span style="white-space:pre"> </span>getParameterMap()getParameterValues(String name)getParameter(String name)
所以問題就轉移到解決這三個方法的亂碼問題就可以解決get方式的亂碼問題。解決方案是將ServletRequest進行改造成MyHttpServletRequest,可以通過兩種方式進行改造一種是裝飾模式,一種是動態代理;由于為我們提供了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;//設置為false,第二次就不會再進這個代碼塊了}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];}}
點擊下載源碼
總結
以上是生活随笔為你收集整理的javaweb 解决请求相应的乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb生成图片验证码
- 下一篇: 可以节约很多代码的几个正则表达式