一个不错处理encoding的过滤器

GET请求中文乱码解决方案
本文介绍了一种解决HTTP GET请求中出现的中文乱码问题的方法。通过自定义过滤器和请求包装类,确保了客户端传递的中文参数能正确解析并处理。此方案适用于Java Web应用,特别针对使用Servlet API的项目。

package com.yida.filter;

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 CharacterFilter implements Filter
{

    private String encoding;

    /**
     * 自定义一个类,完成get请求的中文乱码解决
     *
     * @author yohn
     */
    class MyRequest extends HttpServletRequestWrapper
    {

        public MyRequest(HttpServletRequest request)
        {
            super(request);
        }

        /**
         * 重写父类的方法
         *
         * @param name
         *            元素名
         */
        public String getParameter(String name)
        {
            String str = super.getParameter(name);

            try
            {
                str = new String(str.getBytes("iso8859-1"),encoding);
            }
            catch (Exception e)
            {
            }
            return str;
        }
    }

    public void destroy()
    {

    }

    @SuppressWarnings("unchecked")
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    {
        try
        {
            HttpServletRequest hsr = (HttpServletRequest) request;
            if ("get".equalsIgnoreCase(hsr.getMethod()))
            {
                MyRequest mr = new MyRequest(hsr);
                response.setCharacterEncoding(encoding);

                chain.doFilter(mr,response);

            }
            else
            {
                hsr.setCharacterEncoding(encoding);
                response.setCharacterEncoding(encoding);
                chain.doFilter(request,response);
            }
        }
        catch (Exception e)
        {
        }
    }

    public void init(FilterConfig cfg) throws ServletException
    {
        String ie = cfg.getInitParameter("encoding");
        if (null != ie && "" != ie)
        {
            this.encoding = ie;
        }
        else
        {
            this.encoding = "UTF-8";
        }
    }
    public String getEncoding()
    {
        return encoding;
    }

    public void setEncoding(String encoding)
    {
        this.encoding = encoding;
    }

}

 

****************web.xml****************

<filter>

 <filter-name>ChineseFilter</filter-name>

 <filter-class>com.yida.filter.CharacterFilter</filter-class>
  <init-param>
     <param-name>encoding</param-name>
     <param-value>UTF-8</param-value>
  </init-param>

</filter>

 

<filter-mapping>

  <filter-name>ChineseFilter</filter-name>

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

</filter-mapping>

 

</filter>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值