jsp頁面中文解決辦法


關於JSP頁面之間傳值的中文亂碼總結

用過濾器來解決JSP中文亂碼問題

URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼

URLEncoder與URLDecoder的使用

 

-------------------------------------------------------------------------------------------------------

本部分轉載自:http://blog.csdn.net/gongxifacai_believe/article/details/51605776

 

最近在各位大哥的幫助下,終於解決了jsp頁面之間的傳值問題,總結如下:
 
源代碼,a.jsp往b.jsp傳值:
a.jsp頁面內容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<form action="b.jsp">
    name:<input type=text name=name>
    <input type=submit>
</form>
 
b.jsp頁面內容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
 String name=request.getParameter("name");
%>
<body>
    <%=name%>
</body>
現象:中文亂碼,比如“??????”
 
解決方法如下:
方法一:
1.         在b.jsp中把pageEncoding="GB2312"改為pageEncoding="ISO8859-1"
雖然這樣b.jsp頁面顯示的內容還是亂碼,但是不是那種“??????”的亂碼,而是一些特殊字符
2.         然后在瀏覽器中查看菜單中修改成GB2312的編碼,這時亂碼就顯示中文了。
3.         但是這種方法是不可行的。
方法二:
1.         在b.jsp中把String name=request.getParameter("name");修改為
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");
2.         這時再在頁面上顯示,則就是中文了。
3.         但是我個人不喜歡這種方法,因為編寫起來代碼非常繁瑣
方法三:
1.         有人說修改get/post的傳值方式,但是這是有前提的,如果只是把get方式修改成post方式,頁面結果還是亂碼!
2.         前提你必須配置了過濾器,若果你只是配置了過濾器,則傳值方式必須是:post方式才不是亂碼,如果是get方式照樣是亂碼!
3.         過濾器的配置,我想大家都能有,我就不說了
方法四:
1.         有人說配置tomcat的配置文件server.xml里這句:
 <Connector URIEncoding="GB2312"
port="8080"   maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
 
加上這句:URIEncoding="GB2312"
2.         雖然可以但是有前提的,若果你過濾器沒有配置,則只是配置了server.xml文件,這樣只有在表單是get傳值時候才可以!當是post方式時,照樣是亂碼!
*這時我們就可以看出在tomcat5中的post與get傳值方式是不一樣的*
*有人要問有沒有一種方法讓傳值使用get方式或post方式都好用呢,下面就是我推薦的方法五*
方法五:
1.         其實很簡單,就是同時實現方法三又實現方法四!
2.         就是先配置過濾器,又配置server.xml文件,都設置成GB2312的編碼
3.         這樣無論是post還是get方式的表單傳值,中文都不會是亂碼!
 
這些只是jsp頁面的傳值中文字符亂碼解決,對於jsp與數據庫之間小妹還有待研究
有什么好文章也希望大家給推薦一下

 

------------------------------------------------------------------------------------------------------------

 

本部分轉載自:用過濾器來解決JSP中文亂碼問題

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1.  package com.util;  
  2.  2   
  3.  import java.io.IOException;  
  4.  import java.io.UnsupportedEncodingException;  
  5.  5   
  6.  import javax.servlet.Filter;  
  7.  import javax.servlet.FilterChain;  
  8.  import javax.servlet.FilterConfig;  
  9.  import javax.servlet.ServletException;  
  10. 10 import javax.servlet.ServletRequest;  
  11. 11 import javax.servlet.ServletResponse;  
  12. 12 import javax.servlet.http.HttpServletRequest;  
  13. 13 import javax.servlet.http.HttpServletRequestWrapper;  
  14. 14 import javax.servlet.http.HttpServletResponse;  
  15. 15 import javax.servlet.http.HttpSession;  
  16. 16   
  17. 17   
  18. 18 //過濾器處理表單傳到servlet的亂碼問題  
  19. 19 public class MyFilter implements Filter{  
  20. 20     //自寫一個request換掉原來的request,重寫里面的getParemeter方法,可以設置編碼  
  21. 21     class MyRequest extends HttpServletRequestWrapper{  
  22. 22           
  23. 23         @Override  
  24. 24         public String getParameter(String param) {  
  25. 25             String value = null;  
  26. 26             try {  
  27. 27                 //post  
  28. 28                 super.setCharacterEncoding(encoding);//把編碼轉換為encoding  
  29. 29                 value = super.getParameter(param);  
  30. 30                 if(super.getMethod().equalsIgnoreCase("GET")){  
  31. 31                     if(value!=null){  
  32. 32                         value = new String(value.getBytes("iso8859-1"),encoding);  
  33. 33                     }  
  34. 34                 }  
  35. 35             } catch (UnsupportedEncodingException e) {  
  36. 36                 // TODO Auto-generated catch block  
  37. 37                 e.printStackTrace();  
  38. 38             }  
  39. 39             return value;  
  40. 40         }  
  41. 41   
  42. 42         public MyRequest(HttpServletRequest request) {  
  43. 43             super(request);  
  44. 44         }  
  45. 45           
  46. 46     }  
  47. 47     protected String encoding=null;   
  48. 48     public void destroy() { //銷毀  
  49. 49         // TODO Auto-generated method stub  
  50. 50         this.encoding=null;  
  51. 51     }  
  52. 52    //對編碼問題進行轉換  
  53. 53     public void doFilter(ServletRequest request, ServletResponse response,  
  54. 54             FilterChain chain) throws IOException, ServletException {  
  55. 55         // TODO Auto-generated method stub  
  56. 56         response.setContentType("text/html;charset="+encoding);  
  57. 57         //過濾未登錄用戶  
  58. 58         HttpServletRequest req = (HttpServletRequest) request;  
  59. 59         HttpServletResponse resp = (HttpServletResponse) response;  
  60. 60         String path=req.getServletPath();  
  61. 61         String param=req.getQueryString();  
  62. 62         if(path!=null){  
  63. 63             path=path+"?"+param;//全請求路徑  
  64. 64         }  
  65. 65         if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){  
  66. 66             HttpSession session = req.getSession();  
  67. 67             String userName = (String) session.getAttribute("username");  
  68. 68             if(userName == null){  
  69. 69                 session.setAttribute("url", path.replaceFirst("/", ""));  
  70. 70                 System.out.println(session.getAttribute("url"));  
  71. 71                 resp.sendRedirect("user.do?op=loginAction");  
  72. 72                 return;  
  73. 73             }  
  74. 74         }  
  75. 75         //把過濾器給下一個過濾器或資源處理器  
  76. 76         chain.doFilter(new MyRequest((HttpServletRequest) request), response);   
  77. 77     }  
  78. 78   
  79. 79     public void init(FilterConfig filterConfig) throws ServletException {  
  80. 80         // TODO Auto-generated method stub  
  81. 81         this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定  
  82. 82     }  
  83. 83   
  84. 84 }  


然后在web.xml對該過濾器進行注冊和映射:

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <filter>  
  2.     <filter-name>EncodingFilter</filter-name>  
  3.     <filter-class>com.util.MyFilter</filter-class>  
  4.     <init-param>  
  5.        <param-name>encoding</param-name>  
  6.        <param-value>utf-8</param-value>  
  7.     </init-param>  
  8.   </filter>  
  9.  <filter-mapping>  
  10.      <filter-name>EncodingFilter</filter-name>  
  11.      <url-pattern>/*</url-pattern>  
  12.  </filter-mapping></span>  

 

 

上面寫的過濾器MyFilter類,本來只能處理post提交的數據(post是先處理后接收,get是先接收后處理)。

但是MyFilter里面在對任何頁面過濾的時候,來了一個偷梁換柱:把原來客戶端請求的request給換掉了,換成自己定義的一個request了,即內部類MyRequest,不過該類要繼承一個類HttpServletRequestWrapper。

在自定義的一個內部類MyRequest里面,實現了一個好強大的功能,就是重寫了request的getParameter()方法。該方法里面即處理了post提交,又能處理get提交,返回的值就是處理后的值,所以該過濾器就能實現處理post和get提交的亂碼問題!

 

--------------------------------------------------------------------------------------------------

本部分轉載自:URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼

在傳遞參數的時候,如果有中文,那么可以先轉碼再轉,之后再解碼。

 
使用java.net.URLEncoder.encode()可以對要傳遞的中文進行編碼
a.在傳參數之前先把參數進行轉碼:java.net.URLEncoder.encode(param);
取值時用語句java.net.URLDecoder.decode(param);再轉回中文
b.在你的Tomcat目錄-->conf目錄-->server.xml里找出這段:
<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
<!--在里邊加上這個參數-->
URIEncoding="gb2312"
/>
 
前端的寫法:
<%@ page contentType="text/html;charset=gb2312" %>
<a href="ds. jsp?url=<%=java.net.URLEncoder.encode("編碼的是這里","GB2312")%>">點擊這里</a>
 
使用java.net.URLDecoder.decode()在后面對傳遞的參數進行解碼,一定要搭配使用哦
<%
if(request.getParameter("url")!=null)
{
str=request.getParameter("url");
str=java.net.URLDecoder.decode(str,"GB2312");
str=new String(str.getBytes("ISO-8859-1"));
out.print(str);
}
%>
若,字符編碼為utf-8也可以實現.或者在此段代碼中,不寫出字符編碼也可以(只寫一個參數)。
 
ajax寫法:
$.ajax({ 
           url:'<%=request.getContextPath()%>/cargroup-ajax/searchCargroupName.action',
           async:false,
           data:{
            cargroupName:encodeURI(cargroupName) //中文
            },
           type:'post',
           dataType:'json', 
           success:function(data){
            if(data=="true"){
             if(flag!="form"){
              alert("該名稱可用!");
             } 
             checkRepeat = true;
            }else{
             if(flag!="form"){
              alert("該名稱不可用!");
             }
            } 
           }
    });
 
后台java:
cargroupName = URLDecoder.decode(request.getParameter("cargroupName"), "utf-8");

 

--------------------------------------------------------------------------------------------------------------

 

本部分轉載自:URLEncoder與URLDecoder的使用

今天傳url的時候亂碼了。先說情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")來獲取,jsp中的是GBK的編碼,服務器用的是jboss,里面有個server.xml有如下配置。

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <Connector port="80" address="${jboss.bind.address}"      
  2. maxThreads="250" maxHttpHeaderSize="8192"  
  3. emptySessionPath="true" protocol="HTTP/1.1"  
  4. enableLookups="false" redirectPort="8443" acceptCount="100"  
  5. connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>  

 

 

之前是沒有uriencoding這個屬性的,我給干掉,問題解決,這時候用的是默認值即ISO-8859-1。

關於server.xml的配置可以參考這個url的文檔

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html

問題解決的過程中,我特意研究了一下urlencode和urldecode這兩個類,之所以沒有用這種方案是因為我獲得頁面上的連接的時候用的是一個開源的叫做Cloud的類。

 

網頁中的表單使用POST方法提交時,數據內容的類型是 application/x-www-form-urlencoded,這種類型會: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼; 2.將空格轉換為加號 (+) ; 3.將非文本內容轉換成"%xy"的形式,xy是兩位16進制的數值; 4.在每個 name=value 對之間放置 & 符號。
編碼過程非常簡單,任何字符只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成字節形式,每個字節都寫成這種形式:一個“%”后面跟着兩位16進制的數值。空格是一個特殊情況,因為它們太平常了。它除了被編碼成“%20”以外,還能編碼為一個“+”。加號(+)本身被編碼為%2B。當/ # = & 和?作為名字的一部分來使用時,而不是作為URL部分之間的分隔符來使用時,它們都應該被編碼。
類URL並不自動執行編碼或解碼工作。你能生成一個URL對象,它可以包括非法的ASCII和非ASCII字符和/或%xx。當用方法getPath() 和toExternalForm( ) 作為輸出方法時,這種字符和轉移符不會自動編碼或解碼。你應對被用來生成一個URL對象的字符串對象負責,確保所有字符都會被恰當地編碼。

URLencode這個類負責把String編碼成平台上的通用形式,urldecode類可以把url轉換成string格式。 

下面是urlencode的demo:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         try {  
  3.          System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));  
  4.          System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));  
  5.          System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));  
  6.          System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));  
  7.          System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));  
  8.          System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));  
  9.          System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));  
  10.          System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));  
  11.          System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));  
  12.          System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));  
  13.          System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));  
  14.          System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));  
  15.          System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));  
  16.          System.out.println(URLEncoder.encode("this中華人民共和國","UTF-8"));  
  17.        } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");  
  18.       }  
  19.      }  

 

 

執行結果如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. This+string+has+spaces  
  2. This*string*has*asterisks  
  3. This%25string%25has%25percent%25signs  
  4. This%2Bstring%2Bhas%2Bpluses  
  5. This%2Fstring%2Fhas%2Fslashes  
  6. This%22string%22has%22quote%22marks  
  7. This%3Astring%3Ahas%3Acolons  
  8. This%7Estring%7Ehas%7Etildes  
  9. This%28string%29has%28parentheses%29  
  10. This.string.has.periods  
  11. This%3Dstring%3Dhas%3Dequals%3Dsigns  
  12. This%26string%26has%26ersands  
  13. This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters  
  14. this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD  

 

很明顯url中有/%&=這類字符也會被編碼,對於我們來說是不對的。例如

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         try {  
  3.             System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));  
  4.         } catch (UnsupportedEncodingException e) {  
  5.             e.printStackTrace();  
  6.         }  
  7.     }  

 

這個結果就是不對的了,會有如下輸出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

 

所以這種情形我們要對每一部分做分段encode

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3  

 

對於urldecoder類來說

 

 

它們解碼以x-www-form-url-encoded這種形式編碼的string。也就是說,它們把所有的加號(+)轉換成空格符,把所有的%xx分別轉換成與之相對應的字符

 

直接上demo:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";   
  3.         String output;  
  4.         try {  
  5.             output = URLDecoder.decode(input, "UTF-8");  
  6.             System.out.println(output);   
  7.         } catch (UnsupportedEncodingException e) {  
  8.             e.printStackTrace();  
  9.         }   
  10.     }  

 

關於JSP頁面之間傳值的中文亂碼總結

用過濾器來解決JSP中文亂碼問題

URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼

URLEncoder與URLDecoder的使用

 

-------------------------------------------------------------------------------------------------------

本部分轉載自:關於JSP頁面之間傳值的中文亂碼總結

 

最近在各位大哥的幫助下,終於解決了jsp頁面之間的傳值問題,總結如下:
 
源代碼,a.jsp往b.jsp傳值:
a.jsp頁面內容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<form action="b.jsp">
    name:<input type=text name=name>
    <input type=submit>
</form>
 
b.jsp頁面內容:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
 String name=request.getParameter("name");
%>
<body>
    <%=name%>
</body>
現象:中文亂碼,比如“??????”
 
解決方法如下:
方法一:
1.         在b.jsp中把pageEncoding="GB2312"改為pageEncoding="ISO8859-1"
雖然這樣b.jsp頁面顯示的內容還是亂碼,但是不是那種“??????”的亂碼,而是一些特殊字符
2.         然后在瀏覽器中查看菜單中修改成GB2312的編碼,這時亂碼就顯示中文了。
3.         但是這種方法是不可行的。
方法二:
1.         在b.jsp中把String name=request.getParameter("name");修改為
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");
2.         這時再在頁面上顯示,則就是中文了。
3.         但是我個人不喜歡這種方法,因為編寫起來代碼非常繁瑣
方法三:
1.         有人說修改get/post的傳值方式,但是這是有前提的,如果只是把get方式修改成post方式,頁面結果還是亂碼!
2.         前提你必須配置了過濾器,若果你只是配置了過濾器,則傳值方式必須是:post方式才不是亂碼,如果是get方式照樣是亂碼!
3.         過濾器的配置,我想大家都能有,我就不說了
方法四:
1.         有人說配置tomcat的配置文件server.xml里這句:
 <Connector URIEncoding="GB2312"
port="8080"   maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
 
加上這句:URIEncoding="GB2312"
2.         雖然可以但是有前提的,若果你過濾器沒有配置,則只是配置了server.xml文件,這樣只有在表單是get傳值時候才可以!當是post方式時,照樣是亂碼!
*這時我們就可以看出在tomcat5中的post與get傳值方式是不一樣的*
*有人要問有沒有一種方法讓傳值使用get方式或post方式都好用呢,下面就是我推薦的方法五*
方法五:
1.         其實很簡單,就是同時實現方法三又實現方法四!
2.         就是先配置過濾器,又配置server.xml文件,都設置成GB2312的編碼
3.         這樣無論是post還是get方式的表單傳值,中文都不會是亂碼!
 
這些只是jsp頁面的傳值中文字符亂碼解決,對於jsp與數據庫之間小妹還有待研究
有什么好文章也希望大家給推薦一下

 

------------------------------------------------------------------------------------------------------------

 

本部分轉載自:用過濾器來解決JSP中文亂碼問題

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1.  package com.util;  
  2.  2   
  3.  import java.io.IOException;  
  4.  import java.io.UnsupportedEncodingException;  
  5.  5   
  6.  import javax.servlet.Filter;  
  7.  import javax.servlet.FilterChain;  
  8.  import javax.servlet.FilterConfig;  
  9.  import javax.servlet.ServletException;  
  10. 10 import javax.servlet.ServletRequest;  
  11. 11 import javax.servlet.ServletResponse;  
  12. 12 import javax.servlet.http.HttpServletRequest;  
  13. 13 import javax.servlet.http.HttpServletRequestWrapper;  
  14. 14 import javax.servlet.http.HttpServletResponse;  
  15. 15 import javax.servlet.http.HttpSession;  
  16. 16   
  17. 17   
  18. 18 //過濾器處理表單傳到servlet的亂碼問題  
  19. 19 public class MyFilter implements Filter{  
  20. 20     //自寫一個request換掉原來的request,重寫里面的getParemeter方法,可以設置編碼  
  21. 21     class MyRequest extends HttpServletRequestWrapper{  
  22. 22           
  23. 23         @Override  
  24. 24         public String getParameter(String param) {  
  25. 25             String value = null;  
  26. 26             try {  
  27. 27                 //post  
  28. 28                 super.setCharacterEncoding(encoding);//把編碼轉換為encoding  
  29. 29                 value = super.getParameter(param);  
  30. 30                 if(super.getMethod().equalsIgnoreCase("GET")){  
  31. 31                     if(value!=null){  
  32. 32                         value = new String(value.getBytes("iso8859-1"),encoding);  
  33. 33                     }  
  34. 34                 }  
  35. 35             } catch (UnsupportedEncodingException e) {  
  36. 36                 // TODO Auto-generated catch block  
  37. 37                 e.printStackTrace();  
  38. 38             }  
  39. 39             return value;  
  40. 40         }  
  41. 41   
  42. 42         public MyRequest(HttpServletRequest request) {  
  43. 43             super(request);  
  44. 44         }  
  45. 45           
  46. 46     }  
  47. 47     protected String encoding=null;   
  48. 48     public void destroy() { //銷毀  
  49. 49         // TODO Auto-generated method stub  
  50. 50         this.encoding=null;  
  51. 51     }  
  52. 52    //對編碼問題進行轉換  
  53. 53     public void doFilter(ServletRequest request, ServletResponse response,  
  54. 54             FilterChain chain) throws IOException, ServletException {  
  55. 55         // TODO Auto-generated method stub  
  56. 56         response.setContentType("text/html;charset="+encoding);  
  57. 57         //過濾未登錄用戶  
  58. 58         HttpServletRequest req = (HttpServletRequest) request;  
  59. 59         HttpServletResponse resp = (HttpServletResponse) response;  
  60. 60         String path=req.getServletPath();  
  61. 61         String param=req.getQueryString();  
  62. 62         if(path!=null){  
  63. 63             path=path+"?"+param;//全請求路徑  
  64. 64         }  
  65. 65         if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){  
  66. 66             HttpSession session = req.getSession();  
  67. 67             String userName = (String) session.getAttribute("username");  
  68. 68             if(userName == null){  
  69. 69                 session.setAttribute("url", path.replaceFirst("/", ""));  
  70. 70                 System.out.println(session.getAttribute("url"));  
  71. 71                 resp.sendRedirect("user.do?op=loginAction");  
  72. 72                 return;  
  73. 73             }  
  74. 74         }  
  75. 75         //把過濾器給下一個過濾器或資源處理器  
  76. 76         chain.doFilter(new MyRequest((HttpServletRequest) request), response);   
  77. 77     }  
  78. 78   
  79. 79     public void init(FilterConfig filterConfig) throws ServletException {  
  80. 80         // TODO Auto-generated method stub  
  81. 81         this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定  
  82. 82     }  
  83. 83   
  84. 84 }  


然后在web.xml對該過濾器進行注冊和映射:

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <filter>  
  2.     <filter-name>EncodingFilter</filter-name>  
  3.     <filter-class>com.util.MyFilter</filter-class>  
  4.     <init-param>  
  5.        <param-name>encoding</param-name>  
  6.        <param-value>utf-8</param-value>  
  7.     </init-param>  
  8.   </filter>  
  9.  <filter-mapping>  
  10.      <filter-name>EncodingFilter</filter-name>  
  11.      <url-pattern>/*</url-pattern>  
  12.  </filter-mapping></span>  

 

 

上面寫的過濾器MyFilter類,本來只能處理post提交的數據(post是先處理后接收,get是先接收后處理)。

但是MyFilter里面在對任何頁面過濾的時候,來了一個偷梁換柱:把原來客戶端請求的request給換掉了,換成自己定義的一個request了,即內部類MyRequest,不過該類要繼承一個類HttpServletRequestWrapper。

在自定義的一個內部類MyRequest里面,實現了一個好強大的功能,就是重寫了request的getParameter()方法。該方法里面即處理了post提交,又能處理get提交,返回的值就是處理后的值,所以該過濾器就能實現處理post和get提交的亂碼問題!

 

--------------------------------------------------------------------------------------------------

本部分轉載自:URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼

在傳遞參數的時候,如果有中文,那么可以先轉碼再轉,之后再解碼。

 
使用java.net.URLEncoder.encode()可以對要傳遞的中文進行編碼
a.在傳參數之前先把參數進行轉碼:java.net.URLEncoder.encode(param);
取值時用語句java.net.URLDecoder.decode(param);再轉回中文
b.在你的Tomcat目錄-->conf目錄-->server.xml里找出這段:
<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
<!--在里邊加上這個參數-->
URIEncoding="gb2312"
/>
 
前端的寫法:
<%@ page contentType="text/html;charset=gb2312" %>
<a href="ds. jsp?url=<%=java.net.URLEncoder.encode("編碼的是這里","GB2312")%>">點擊這里</a>
 
使用java.net.URLDecoder.decode()在后面對傳遞的參數進行解碼,一定要搭配使用哦
<%
if(request.getParameter("url")!=null)
{
str=request.getParameter("url");
str=java.net.URLDecoder.decode(str,"GB2312");
str=new String(str.getBytes("ISO-8859-1"));
out.print(str);
}
%>
若,字符編碼為utf-8也可以實現.或者在此段代碼中,不寫出字符編碼也可以(只寫一個參數)。
 
ajax寫法:
$.ajax({ 
           url:'<%=request.getContextPath()%>/cargroup-ajax/searchCargroupName.action',
           async:false,
           data:{
            cargroupName:encodeURI(cargroupName) //中文
            },
           type:'post',
           dataType:'json', 
           success:function(data){
            if(data=="true"){
             if(flag!="form"){
              alert("該名稱可用!");
             } 
             checkRepeat = true;
            }else{
             if(flag!="form"){
              alert("該名稱不可用!");
             }
            } 
           }
    });
 
后台java:
cargroupName = URLDecoder.decode(request.getParameter("cargroupName"), "utf-8");

 

--------------------------------------------------------------------------------------------------------------

 

本部分轉載自:URLEncoder與URLDecoder的使用

今天傳url的時候亂碼了。先說情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")來獲取,jsp中的是GBK的編碼,服務器用的是jboss,里面有個server.xml有如下配置。

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <Connector port="80" address="${jboss.bind.address}"      
  2. maxThreads="250" maxHttpHeaderSize="8192"  
  3. emptySessionPath="true" protocol="HTTP/1.1"  
  4. enableLookups="false" redirectPort="8443" acceptCount="100"  
  5. connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>  

 

 

之前是沒有uriencoding這個屬性的,我給干掉,問題解決,這時候用的是默認值即ISO-8859-1。

關於server.xml的配置可以參考這個url的文檔

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html

問題解決的過程中,我特意研究了一下urlencode和urldecode這兩個類,之所以沒有用這種方案是因為我獲得頁面上的連接的時候用的是一個開源的叫做Cloud的類。

 

網頁中的表單使用POST方法提交時,數據內容的類型是 application/x-www-form-urlencoded,這種類型會: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼; 2.將空格轉換為加號 (+) ; 3.將非文本內容轉換成"%xy"的形式,xy是兩位16進制的數值; 4.在每個 name=value 對之間放置 & 符號。
編碼過程非常簡單,任何字符只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成字節形式,每個字節都寫成這種形式:一個“%”后面跟着兩位16進制的數值。空格是一個特殊情況,因為它們太平常了。它除了被編碼成“%20”以外,還能編碼為一個“+”。加號(+)本身被編碼為%2B。當/ # = & 和?作為名字的一部分來使用時,而不是作為URL部分之間的分隔符來使用時,它們都應該被編碼。
類URL並不自動執行編碼或解碼工作。你能生成一個URL對象,它可以包括非法的ASCII和非ASCII字符和/或%xx。當用方法getPath() 和toExternalForm( ) 作為輸出方法時,這種字符和轉移符不會自動編碼或解碼。你應對被用來生成一個URL對象的字符串對象負責,確保所有字符都會被恰當地編碼。

URLencode這個類負責把String編碼成平台上的通用形式,urldecode類可以把url轉換成string格式。 

下面是urlencode的demo:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         try {  
  3.          System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));  
  4.          System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));  
  5.          System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));  
  6.          System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));  
  7.          System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));  
  8.          System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));  
  9.          System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));  
  10.          System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));  
  11.          System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));  
  12.          System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));  
  13.          System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));  
  14.          System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));  
  15.          System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));  
  16.          System.out.println(URLEncoder.encode("this中華人民共和國","UTF-8"));  
  17.        } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");  
  18.       }  
  19.      }  

 

 

執行結果如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. This+string+has+spaces  
  2. This*string*has*asterisks  
  3. This%25string%25has%25percent%25signs  
  4. This%2Bstring%2Bhas%2Bpluses  
  5. This%2Fstring%2Fhas%2Fslashes  
  6. This%22string%22has%22quote%22marks  
  7. This%3Astring%3Ahas%3Acolons  
  8. This%7Estring%7Ehas%7Etildes  
  9. This%28string%29has%28parentheses%29  
  10. This.string.has.periods  
  11. This%3Dstring%3Dhas%3Dequals%3Dsigns  
  12. This%26string%26has%26ersands  
  13. This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters  
  14. this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD  

 

很明顯url中有/%&=這類字符也會被編碼,對於我們來說是不對的。例如

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         try {  
  3.             System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));  
  4.         } catch (UnsupportedEncodingException e) {  
  5.             e.printStackTrace();  
  6.         }  
  7.     }  

 

這個結果就是不對的了,會有如下輸出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

 

所以這種情形我們要對每一部分做分段encode

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3  

 

對於urldecoder類來說

 

 

它們解碼以x-www-form-url-encoded這種形式編碼的string。也就是說,它們把所有的加號(+)轉換成空格符,把所有的%xx分別轉換成與之相對應的字符

 

直接上demo:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";   
  3.         String output;  
  4.         try {  
  5.             output = URLDecoder.decode(input, "UTF-8");  
  6.             System.out.println(output);   
  7.         } catch (UnsupportedEncodingException e) {  
  8.             e.printStackTrace();  
  9.         }   
  10.     }  

 

輸入的結果如下:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3  

 

更多的可以參考這個文章:

 

http://www.java3z.com/cwbwebhome/article/article2/2414.html

總結一下,今天發生的中文亂碼的問題最終的解決方案可能和urlencode和urldecode沒有多大關系,這里有時間還要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用來把url中非數字和字母的字符轉換成%加兩位16進制。urldecode主要有decode方法,用來把一個含有%加兩位16進制的url轉換成正常的編碼。

輸入的結果如下:

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3  

 

更多的可以參考這個文章:

 

http://www.java3z.com/cwbwebhome/article/article2/2414.html

總結一下,今天發生的中文亂碼的問題最終的解決方案可能和urlencode和urldecode沒有多大關系,這里有時間還要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用來把url中非數字和字母的字符轉換成%加兩位16進制。urldecode主要有decode方法,用來把一個含有%加兩位16進制的url轉換成正常的編碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM