fossil

          鳥在籠中,恨關羽不能張飛 人處世上,要八戒更須悟空
          posts - 40, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          常見的 Tomcat 5 表單編碼提交后亂碼的解決方案有很多, 有改 Tomcat Connector 屬性的, 有加過濾器的. 但是 Tomcat 自帶的那個過濾器只解決了 POST 方式的亂碼卻不能處理 GET 方式的亂碼.  在這里那我就給出一個不需要修改任何 Tomcat 配置文件的完美解決中文問題的過濾器的代碼:

          首先是我們的測試頁面:

          GET 方式:

          POST 方式:

          index.jsp

          <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
          
          
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
             
              <title>表單測試頁面</title>
          
            </head>
            
            <body>
             <form action="action.jsp">
             GET 方式: <input type=text name="name" value="GET 中文">
             <input type=submit>
             </form>
             
                <form action="action.jsp" method="POST">
             POST 方式: <input type=text name="name" value="POST 中文">
             <input type=submit>
             </form>
            </body>
          </html>
          

          和普通的表單沒有任何區別.

          然后就是表單提交頁面 action.jsp:

          <%@ page language="java" pageEncoding="GBK"%>
          <html>
            <body>
             參數: <%=request.getParameter("name") %> <br>
            </body>
          </html>

          接著是過濾器的配置文件 web.xml (用 2.5 版本也可以):

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.4" 
              xmlns="http://java.sun.com/xml/ns/j2ee" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
              <filter>
              <filter-name>TomcatFormFilter</filter-name>
              <filter-class>filters.TomcatFormFilter</filter-class>
              </filter>
              
              <filter-mapping>
              <filter-name>TomcatFormFilter</filter-name>
              <url-pattern>*.jsp</url-pattern>
              </filter-mapping>
              
            <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
          </web-app>

          最后最關鍵的就是我們的過濾器代碼了, 對 GET 方式使用請求包裝器, 而 POST 方式則用 setCharacterEncoding():

          package filters;
          
          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;
          import javax.servlet.ServletException;
          import  javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletRequestWrapper;
          import javax.servlet.http.HttpServletResponse;
          
          public class TomcatFormFilter implements Filter {
              /**
                * Request.java
                * 對 HttpServletRequestWrapper 進行擴充, 不影響原來的功能并能提供所有的 HttpServletRequest
                * 接口中的功能. 它可以統一的對 Tomcat 默認設置下的中文問題進行解決而只需要用新的 Request 對象替換頁面中的
                * request 對象即可.
                */
          
              class Request extends HttpServletRequestWrapper
              {
          
                  public Request(HttpServletRequest request) {
                      super(request);
                  }
          
                  /**
                   * 轉換由表單讀取的數據的內碼.
                   * 從 ISO 字符轉到 GBK.
                   */
                  public String toChi(String input) {
                      try {
                        byte[] bytes = input.getBytes("ISO8859-1");
                        return new String(bytes, "GBK");
                      }
                      catch (Exception ex) {
                      }
                      return null;
                  }
          
                  /**
                   * Return the HttpServletRequest holded by this object.
                   */
                  private HttpServletRequest getHttpServletRequest()
                  {
                      return (HttpServletRequest)super.getRequest();
                  }
          
                  /**
                   * 讀取參數 -- 修正了中文問題.
                   */
                  public String getParameter(String name)
                  {
                      return toChi(getHttpServletRequest().getParameter(name));
                  }
          
                  /**
                   * 讀取參數列表 - 修正了中文問題.
                   */
                  public String[] getParameterValues(String name)
                  {
                        String values[] = getHttpServletRequest().getParameterValues(name);
                        if (values != null) {
                          for (int i = 0; i < values.length; i++) {
                            values[i] = toChi(values[i]);
                          }
                        }
                        return values;
                  }
              }
              public void destroy() {
                  
              }
          
              public void doFilter(ServletRequest request, ServletResponse response,
                      FilterChain chain) throws IOException, ServletException {
                  HttpServletRequest httpreq = (HttpServletRequest)request;
                  if(httpreq.getMethod().equals("POST")) {
                      request.setCharacterEncoding("GBK");
                  } else {
                      request = new Request(httpreq);
                  }
          
                  chain.doFilter(request, response);
              }
          
              public void init(FilterConfig filterConfig) throws ServletException {
              }
          
          }
          

          怎么樣, 是不是很簡單也很方便呢?



          BeanSoft 2007-10-09 13:29 發表評論

          文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/09/151368.html

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 天柱县| 射洪县| 鲁甸县| 安仁县| 河源市| 井冈山市| 环江| 商丘市| 天峻县| 安乡县| 隆昌县| 象州县| 宁城县| 宁津县| 鲁甸县| 河池市| 钦州市| 新宁县| 柘荣县| 宣城市| 哈尔滨市| 米脂县| 衡山县| 南平市| 焉耆| 辽阳市| 晋州市| 临湘市| 廊坊市| 醴陵市| 香港| 紫阳县| 新乐市| 正阳县| 克拉玛依市| 东城区| 邮箱| 鄂托克旗| 桂东县| 晋江市| 江安县|