posts - 8,  comments - 11,  trackbacks - 0
          本文轉自BeanSoft: http://www.aygfsteel.com/beansoft/archive/2007/10/09/151368.html

          常見的 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 {
              }
              }
              

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


          posted on 2007-10-14 22:16 詩語江南 閱讀(443) 評論(0)  編輯  收藏 所屬分類: Core JAVA
          <2007年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          友情連接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 青龙| 鄂托克前旗| 扬中市| 万年县| 盈江县| 镇沅| 内乡县| 宁海县| 大余县| 木兰县| 长武县| 罗定市| 大石桥市| 武夷山市| 连南| 衡阳市| 扶余县| 罗江县| 贺兰县| 安徽省| 若尔盖县| 黄浦区| 丰台区| 浦东新区| 东安县| 阿克苏市| 临海市| 梁平县| 米林县| 师宗县| 门源| 漾濞| 尖扎县| 荥经县| 刚察县| 金昌市| 廉江市| 和平县| 富锦市| 延安市| 大新县|