Post与Get提交使用过滤器解决中文乱码问题

本文介绍了一种改进的Tomcat请求过滤器实现,通过自定义的Request类,解决了Tomcat默认设置下中文问题,统一了对中文数据的编码处理,确保了表单读取数据的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 FilterConfig filterConfig;
 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 {
  this.filterConfig = filterConfig;
 }

}


XML中的配置代码
  <filter>
    <filter-name>charFilter</filter-name>
    <filter-class>com.web.filter.TomcatFormFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>charFilter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值