qingfengxia 发表于 2013-2-6 08:45:34

Tomcat 5/6 utf-8 编码下完美解决(post/get)中文表单问题的过滤器

1.过滤器(包含get与post方式)SetCharacterEncodingFilter.java
package com.qingfeng.filter;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.UnavailableException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class SetCharacterEncodingFilter implements Filter {   /**   *   * 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest   * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的   * request 对象即可.   */    protected String encoding = null;    protected FilterConfig filterConfig = null;    //protected boolean ignore = true;    public void destroy() {      this.encoding = null;      this.filterConfig = null;    }      class Request extends HttpServletRequestWrapper {      public Request(HttpServletRequest request) {            super(request);      }      /**         * 转换由表单读取的数据的内码.         * 从 ISO 字符转到 utf-8(或gbk).         */      public String toChi(String input) {            try {                              byte[] bytes = input.getBytes("ISO-8859-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 = toChi(values);                }            }            return values;      }    }    public void doFilter(ServletRequest request, ServletResponse response,                         FilterChain chain)      throws IOException, ServletException {       // if (ignore || (request.getCharacterEncoding() == null)) {       //   String encoding = selectEncoding(request);            /*if (encoding != null)                request.setCharacterEncoding(encoding);*/       // }      HttpServletRequest httpreq = (HttpServletRequest)request;      if(httpreq.getMethod().equals("POST")) {            request.setCharacterEncoding(encoding);      } else {            request = new Request(httpreq);      }    // Pass control on to the next filter      chain.doFilter(request, response);    }    /**   * Place this filter into service.   *   * @param filterConfig The filter configuration object   */    public void init(FilterConfig filterConfig) throws ServletException {    this.filterConfig = filterConfig;      this.encoding = filterConfig.getInitParameter("encoding");   }} 
2.web.xml中增加过滤器配置
<?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>encodingfilter</filter-name>      <filter-class>com.filter.SetCharacterEncodingFilter</filter-class>      <init-param>            <param-name>encoding</param-name>            <param-value>utf-8</param-value>      </init-param>    </filter>    <filter-mapping>      <filter-name>encodingfilter</filter-name>      <url-pattern>/jsp/encoding/*</url-pattern>    </filter-mapping><servlet>    <description>changecode</description>    <display-name>changecode</display-name>    <servlet-name>CodeServlet</servlet-name>    <servlet-class>com.filter.CodeServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>CodeServlet</servlet-name>    <url-pattern>/servlet/CodeServlet</url-pattern></servlet-mapping></web-app> 
3.测试页面
(1) test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>    <title>My JSP 'test.jsp' starting page</title>    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    --></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>   <form action="/Test_2/servlet/CodeServlet">   GET 方式: <input type=text name="name" value="GET 中文">   <input type=submit>   </form>   <form action="/Test_2/servlet/CodeServlet" method="POST">   POST 方式: <input type=text name="name" value="POST 中文">   <input type=submit>   </form></body></html> 
(2)action.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>    <title>My JSP 'action.jsp' starting page</title>    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    --></head>   参数: <%=request.getParameter("name") %> <br></body></html> 
(3)CodeServlet.java

package com.filter.codetest;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CodeServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {      String name = request.getParameter("name");      System.out.println("get方式:"+name);    }    /**   * The doPost method of the servlet. <br>   *   * This method is called when a form has its tag value method equals to post.   *   * @param request the request send by the client to the server   * @param response the response send by the server to the client   * @throws ServletException if an error occurred   * @throws IOException if an error occurred   */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {      String name = request.getParameter("name");      System.out.println("post方式:"+name);         }}  
页: [1]
查看完整版本: Tomcat 5/6 utf-8 编码下完美解决(post/get)中文表单问题的过滤器