`

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

 
阅读更多
query = new String(query.getBytes("iso8859-1"), "utf-8");


从开始接触J2EE,中文参数传递乱码问题一直伴随着我们,回忆一下我自己的解决过程吧。

各位转载请著名出处哦:http://hi.baidu.com/hyh8774

一:首先学到的解决方法是在页面中request.setCharacterEncoding(“GB18030”)来设置请求的编码为中文编码,然后就在每个需要接收参数的页面噼里啪啦的写上这么一句,对当时的水平来说虽然累却也开心。

二:后来开始做分页程序了,突然发现必须得用URL传参了,也就是要用GET方法传参了,那就用吧,程序里照样来request.setCharacterEncoding(“GB18030”)这么一句,然后大失所望,传进来的中文参数(搜索的关键字)出现乱码了,开始郁闷了,查资料才发现原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,然而,在 tomcat5 中,get 与 post 的处理是分开进行的。那咋办呢?继续Google,得到的答案是字符转码,来这么一句new String( request.getParameter("para").getBytes("iso8859-1"), "gb18030");发现OK了,高兴!然后遇到类似的中文参数就转啊转的,感觉世界不那么美好了!这还不累死人啊,一会GET转,一会POST转,痛苦!

三:后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb18030 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat 有示例代码,方便了,感觉世界美好了些,不用每个页面写request.setCharacterEncoding了,但是上面遇到的第二个问题任然没有解决啊,只要是GET方式的中文传参,还得转码。。。先用着吧。。。谁叫Tomcat美国人写的呢。。。

四:不过还好,在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对 Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置 URIEncoding=”GB18030” 用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。当然对POST方法还得在过滤器中设置request编码。另一个参数是useBodyEncodingForURI = true设置为true后,只要在页面中request.setCharacterEncoding(“GB18030”)那么无论GET还是POST方式的中文传参都不会出现问题,所以useBodyEncodingForURI = true加过滤器算是一个很好的中文传参解决方法了。

五:上面的方法虽然好,但是对项目的可移植性来说太差了,毕竟咱现在做的些个小项目还没有用专门的web服务器,你让人家服务器就为你一个小屁项目修改自己配置文件,那别人的项目咋办?如果是远程的服务器就更麻烦了。所以还是把这些个处理放到自己的程序中吧。

六:接下来的就是本人现在采用的解决方案,仍然是过滤器,也是本人写这篇文章的中心所在,常规的过滤器只对POST方式有效,所以当请求方式为GET时考虑重写request.getParameter() 和request.getParameterValues()方法,在自己的方法中将中文转码,既然要重写,而ServletRequest为接口,那么自然得有实现了,我们就继承实现它的类HttpServletRequestWrapper吧,这样外部的JSP/SERVLET就不需要做任何处理了,可谓一劳永逸,呵呵!

好了,还是来看一下具体的代码吧:


过滤器CharsetAllEncodingFilter.java
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class CharsetAllEncodingFilter implements Filter {

private String encoding = null;

/**
* Request.java 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的
* HttpServletRequest 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request
* 对象替换页面中的 request 对象即可.
*/

class Request extends HttpServletRequestWrapper {
 
   private String encoding = null;

   public Request(HttpServletRequest request) {
    super(request);
    encoding = CharsetAllEncodingFilter.this.encoding;
   }

   /**
   * 转换由表单读取的数据的内码. 从 ISO 字符转到 在web.xml中设置的encoding.
   */
   public String toChi(String input) {
    if(input == null) {
     return null;
    } else {
     try {
      byte[] bytes = input.getBytes("ISO8859-1");
      return new String(bytes, encoding);
     } 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(encoding);
   } else {
    request = new Request(httpreq);
   }

   chain.doFilter(request, response);
}

public void init(FilterConfig filterConfig) throws ServletException {
   encoding = filterConfig.getInitParameter("encoding");
}

}


接下来配置web.xml
<filter>

<filter-name>CharsetEncodingFilter</filter-name>

<filter-class>filters.CharsetAllEncodingFilter</filter-class>

<init-param>

      <param-name>encoding</param-name>

      <param-value>GB18030</param-value>

</init-param>

</filter>      

<filter-mapping>

<filter-name>CharsetEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>





引文来源  [原创]超强过滤器彻底解决JSP/SERVLET中文参数GET/POST传递的问题_Lings百度空间 for J2EE | SSH/Struts2/Tapestry/JSF/iBATIS/EJB/SQL/Ajax/Linux
分享到:
评论

相关推荐

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

    遇到类似的中文参数就转啊转的,感觉世界不那么美好了!这还不累死人啊,一会GET转,一会POST转,痛苦! 超强过滤器彻底解决JSP-SERVLET中文参数GET-POST传递的问题

    JSP利用过滤器解决request中文乱码问题

    本文为大家分享了JSP用过滤器解决request中文乱码问题,具体内容如下 (1)客户端的数据一般是通过HTTP GET/POST方式提交给服务器,在服务器端用request.getParameter() 读取参数时,很容易出现中文乱码现象。 (2...

    JSP用过滤器解决request getParameter中文乱码问题

    (2)用过滤器解决request中文乱码问题。 (3)代码如下: package my; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ChineseFilter implements Filter { //定义了一个...

    Head First Servlet JSP(清晰中文版).part2

    《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的...

    Head First Servlet JSP(清晰中文版).part3

    《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的...

    Head First Servlet JSP(清晰中文版).part1

    《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的...

    Head First Servlet JSP(清晰中文版).part4

    《Head First Servlets·JSP》(中文版)结合SCWCD考试大纲讲述了关于如何编写servlets和JSP代码,如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的...

    XML Oracle Servlet 复习汇总(S2)

    1 Oracle:索引 5分 2 Oracle:plsql,游标 6分 3 Oracle:sql命令 8分 4 Oracle:数据库创建,授权 6分 5 Oracle:plsql块 5分 6 Oracle:过程与函数 6分 ...25 Servlet:过滤器 9分 26 Servlet:simpletag 6分

    网页教程《跟姐姐学JSP》

    序言 1. 想用jsp做网站的朋友看过来 2. 预备知识 3. java环境配置 3.1. 安装jdk 3.2. 配置tomcat服务器 ...16.2. 对手工将jsp转换为servlet的无用讨论 16.3. 胡乱解释一下session 16.4. 下载文件乱码

    吴天雄--JavaWeb完整笔记.doc

    模块二:使用eclipse和idea快速开发jsp(idea和tomcat的相关配置、eclipse创建web项目、jsp页面元素、jsp九大内置对象、四大作用域对象、解决get/post请求乱码问题、cookie和session详解、请求重定向);模块三:...

    easy-servlet

    项目包含3层: servlet层-包括从客户端获取GET / POST请求的servlet 服务层-包含所有可用的操作过滤器层-包含授权过滤器,该过滤器阻止来自客户端的所有请求和编码过滤器dao层-包括使用数据库的方法如果您有任何...

    Web 常见面试题

    该文档整理了web常见面试题,包括一下内容: ...2. GET 和 POST 的区别(4个) ...4. Cookie 和 Session
区别 5. 什么是 jsp,什么是 Servlet?...7. 过滤器和监听器是什么,有什么用 8. 谈谈你对 ajax 的认识?

    JAVA基础学习总结笔记

    看的东西不在多,而在于精, 程序设计最重要的就是上级操作了, 既然选择了,就该要有...过滤器,监听器 struts相关笔记. 等等...... 里面是当年自学JAVA时的一些笔记,内容都是TXT格式的,都是一些基础性的概念总结。

    Java面试宝典2020修订版V1.0.1.doc

    7、简述ajax中Js脚本缓存问题该如何解决? 26 8、同步和异步怎么理解?分别在什么情况下使用。 26 9、java后台如何接收ajax数据? 26 10、为什么要有jquery? 26 11、jQuery选择器有多少种? 27 13、你是如何使用...

    j2ee:这是 j2ee 示例活动的主要存储库

    HEAD 练习列表理解 HTTP 请求和响应运行第一个 servlet 并修改响应对象通过请求对象从 URL 获取参数使用 GET 方法通过表单获取请求参数使用 POST 方法通过表单获取请求参数获取各种 HTML 元素的请求参数将请求转发...

    jpivot学习总结.doc

    JPivot 是一套基于 Mondrian 的 OLAP 前端展现工具,它提供了一套标签库来解决的 OLAP 的展现层问题。 在一个 JSP 页面当中,如果要使用 JPivot 标签库,除了要配置相关的配置文件外,我们需要在 JSP 头的位置声明...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

Global site tag (gtag.js) - Google Analytics