`
yangshen998
  • 浏览: 1249256 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
  • 常见的Tomcat5表单编码提交后乱码的解决方案有很多,有改TomcatConnector属性的,有加过滤器的.但是Tomcat自带的那个过滤器只解决了POST方式的乱码却不能处理GET方式的乱码.在这里那我就给出一个不需要修改任何Tomcat配置文件的完美解决中文问题的过滤器的代码:
  • 首先是我们的测试页面:
  • GET方式:
  • POST方式:
  • index.jsp
  • <%@pagelanguage="java"import="java.util.*"pageEncoding="GBK"%>
  • <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  • <html>
  • <head>
  • <title>表单测试页面</title>
  • </head>
  • <body>
  • <formaction="action.jsp">
  • GET方式:<inputtype=textname="name"value="GET中文">
  • <inputtype=submit>
  • </form>
  • <formaction="action.jsp"method="POST">
  • POST方式:<inputtype=textname="name"value="POST中文">
  • <inputtype=submit>
  • </form>
  • </body>
  • </html>
  • 和普通的表单没有任何区别.
  • 然后就是表单提交页面action.jsp:
  • <%@pagelanguage="java"pageEncoding="GBK"%>
  • <html>
  • <body>
  • 参数:<%=request.getParameter("name")%><br>
  • </body>
  • </html>
  • 接着是过滤器的配置文件web.xml(用2.5版本也可以):
  • <?xmlversion="1.0"encoding="UTF-8"?>
  • <web-appversion="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():
  • packagefilters;
  • importjava.io.IOException;
  • importjavax.servlet.Filter;
  • importjavax.servlet.FilterChain;
  • importjavax.servlet.FilterConfig;
  • importjavax.servlet.ServletException;
  • importjavax.servlet.ServletRequest;
  • importjavax.servlet.ServletResponse;
  • importjavax.servlet.ServletException;
  • importjavax.servlet.http.HttpServlet;
  • importjavax.servlet.http.HttpServletRequest;
  • importjavax.servlet.http.HttpServletRequestWrapper;
  • importjavax.servlet.http.HttpServletResponse;
  • publicclassTomcatFormFilterimplementsFilter{
  • /**
  • *Request.java
  • *对HttpServletRequestWrapper进行扩充,不影响原来的功能并能提供所有的HttpServletRequest
  • *接口中的功能.它可以统一的对Tomcat默认设置下的中文问题进行解决而只需要用新的Request对象替换页面中的
  • *request对象即可.
  • */
  • classRequestextendsHttpServletRequestWrapper
  • {
  • publicRequest(HttpServletRequestrequest){
  • super(request);
  • }
  • /**
  • *转换由表单读取的数据的内码.
  • *从ISO字符转到GBK.
  • */
  • publicStringtoChi(Stringinput){
  • try{
  • byte[]bytes=input.getBytes("ISO8859-1");
  • returnnewString(bytes,"GBK");
  • }
  • catch(Exceptionex){
  • }
  • returnnull;
  • }
  • /**
  • *ReturntheHttpServletRequestholdedbythisobject.
  • */
  • privateHttpServletRequestgetHttpServletRequest()
  • {
  • return(HttpServletRequest)super.getRequest();
  • }
  • /**
  • *读取参数--修正了中文问题.
  • */
  • publicStringgetParameter(Stringname)
  • {
  • returntoChi(getHttpServletRequest().getParameter(name));
  • }
  • /**
  • *读取参数列表-修正了中文问题.
  • */
  • publicString[]getParameterValues(Stringname)
  • {
  • Stringvalues[]=getHttpServletRequest().getParameterValues(name);
  • if(values!=null){
  • for(inti=0;i<values.length;i++){
  • values[i]=toChi(values[i]);
  • }
  • }
  • returnvalues;
  • }
  • }
  • publicvoiddestroy(){
  • }
  • publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
  • FilterChainchain)throwsIOException,ServletException{
  • HttpServletRequesthttpreq=(HttpServletRequest)request;
  • if(httpreq.getMethod().equals("POST")){
  • request.setCharacterEncoding("GBK");
  • }else{
  • request=newRequest(httpreq);
  • }
  • chain.doFilter(request,response);
  • }
  • publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  • }
  • }
  • 分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics