`
aben328
  • 浏览: 1457305 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类

Tomcat 5/6 GBK 编码下完美解决中文表单问题的过滤器

    博客分类:
  • web
阅读更多

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

}

怎么样, 是不是很简单也很方便呢?

分享到:
评论

相关推荐

    tomcat5中文问题完美解决

    【Tomcat5中文问题解决详解】 在使用Tomcat5运行含有中文内容的应用程序时,可能会遇到中文乱码的问题。这通常涉及到HTTP请求的处理方式,尤其是对于POST和GET请求的不同处理策略。以下是对该问题的深入解析及解决...

    使用过滤器解决中文乱码问题

    ### 使用过滤器解决中文乱码问题 在Web开发过程中,经常遇到的一个问题是中文或其它非ASCII字符的乱码问题。这种现象通常出现在浏览器接收的数据与实际编码格式不匹配时。解决此类问题的一种常见方法是使用过滤器...

    解决tomcat中文乱码问题.doc

    综上所述,通过合理设置JSP页面编码、配置请求过滤器以及进行必要的编码转换,可以有效解决Tomcat环境下中文乱码的问题。在实际应用中,还需要根据具体情况选择合适的解决方案,并注意保持前后端编码的一致性。

    Tomcat和weblogic中文乱码问题解决方案

    在 Tomcat 服务器中,可以使用以下过滤器来解决中文乱码问题: ```java package com; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet....

    用Filter来解决中文表单提交问题

    在`TomcatFormFilter`的代码中,我们看到这个过滤器主要解决了Tomcat服务器下中文表单提交时的乱码问题。它创建了一个名为`Request`的内部类,该类继承自`HttpServletRequestWrapper`,目的是为了封装原始的`...

    解决Tomcat+MySql+Struts的中文问题

    在开发基于Java的Web应用程序时,常常会遇到中文字符编码的问题,尤其是在Tomcat服务器、MySQL数据库和Struts框架的组合中。这个问题主要涉及到字符集的兼容性和一致性,因为每个环节都可能有自己的默认编码方式,...

    中文乱码解决方案.pdf

    中文乱码解决方案 本文将详细介绍中文乱码问题的解决方案,并对IE6的“以UTF-8发送URL”选项设置对请求页面...通过统一使用UTF-8编码、设置Tomcat容器的URI编码为UTF-8、使用过滤器等方法,我们可以解决中文乱码问题。

    超强过滤器彻底解决JSP-SERVLET中文参数GET-POST传递的问题(转)

    - 对于POST请求,由于在读取请求参数前可以设置编码,因此在Servlet中使用上述方法可以解决问题。 - 但是,如果需要同时处理GET和POST,以及避免每个Servlet都写相同的代码,那么创建一个全局Filter是最好的解决...

    Tomcat 5.5中应用开发过程中中文乱码的解决.docx

    Tomcat 5.5版本中,由于其默认采用ISO8859_1编码,这可能会导致在处理中文字符时出现乱码问题。为了解决这个问题,我们需要对Tomcat的配置进行一些调整。 首先,我们要理解两种主要的数据传输方式:POST和GET。当...

    解决web开发中的中文问题.doc

    对于表单提交或数据库操作中的中文乱码问题,可以通过编写过滤器来解决。过滤器可以确保所有进入系统的请求都被统一地设置为指定的编码格式,比如UTF-8。 下面是一个简单的过滤器示例代码: ```java import java....

    JavaWeb开发中文乱码问题解决方案

    1. **字符编码基础**:理解字符编码是解决问题的第一步。常见的字符集有GBK、GB2312(简体中文)、Big5(繁体中文)以及Unicode家族的UTF-8、UTF-16等。UTF-8是一种变长编码,可以兼容全世界几乎所有的字符,因此在...

    中文乱码解决方案参考.pdf

    因此,为避免中文乱码,最佳实践是确保所有环节使用一致的UTF-8编码,包括页面、Tomcat配置、过滤器和浏览器设置。对于不支持UTF-8的旧版浏览器(如某些版本的IE),可能需要额外的处理,如提示用户更改浏览器设置或...

    SpringMVC Tomcat控制台乱码问题解决方案

    本文主要介绍了SpringMVC Tomcat控制台乱码问题解决方案,该解决方案通过修改Tomcat的logging.properties文件和使用过滤器来解决乱码问题。使用该解决方案可以解决SpringMVC框架中出现的乱码问题,对大家的学习或者...

    解决web项目开发中常见的中文乱码问题.pdf

    在Web项目开发中,中文乱码问题是一个常见但棘手的问题,主要出现在用户输入的数据在传输过程中出现编码不一致导致的。以下是一些解决此类问题的关键知识点和实践方法: 1. **请求编码与响应编码设置** 当用户通过...

    怎么解决JSP页面中文问题20100901

    对于POST请求中的中文参数,可以使用过滤器来统一处理编码问题。过滤器只对POST请求有效,对于GET请求则无效。具体实现方式如下: ```java public class EncodingFilter implements Filter { @Override public ...

    Java Web开发中的中文乱码问题分析及解决方案.pdf

    1. 使用过滤器(Filter):在Servlet容器中配置过滤器,重写`HttpServletRequest.getParameter()`方法,确保所有请求参数按照正确的编码进行解码。例如,可以统一使用UTF-8编码。 2. 设置HTTP头信息:在HTTP响应中...

    中文乱码问题解决方法

    中文乱码问题解决方法 在 JSP 开发中,中文乱码问题是一个常见的问题,本文总结了 JSP 中中文乱码问题的解决方法,希望能够帮助正在烦恼...通过这个过滤器,可以统一地设置请求的编码方式,从而解决中文乱码的问题。

    JSP页面中文乱码几个解决办法

    总结来说,解决JSP页面中文乱码问题的关键在于保持字符编码的一致性,从编辑器保存文件的编码、JSP页面的编码声明、Servlet的响应编码、POST请求的参数编码,到服务器处理GET请求的编码,都需要进行适配和统一。...

    中文乱码解决方案归纳.pdf

    本文主要探讨了在使用Tomcat作为servlet容器,浏览器包括Firefox3.0和IE6的情况下,如何解决中文乱码问题,以及各种请求方式(GET、POST)下可能出现的乱码情况。 首先,确保所有页面的`charset`设置为`UTF-8`是...

    JavaWeb开发中的中文乱码问题分析及解决方案.docx

    ### JavaWeb开发中的中文乱码问题分析及解决方案 #### 摘要 在JavaWeb开发过程中,中文乱码问题是常见的技术挑战之一。该问题源于不同组件间的编码方式不一致,尤其是在涉及用户输入、数据库交互以及页面展示等环节...

Global site tag (gtag.js) - Google Analytics