解决Servlet中处理GET请求乱码问题

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。
②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)

二、解决办法

方法一 每次传输都手动设置编码(GET方式传输数据) 传输方

String name = URLEncoder.encode("张三","UTF-8"); String path = "http://localhost:8008/xyWeb/xyServlet?name=" + name;

接收方

String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");

若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

方法二(过滤器)

/** 
 - 编码过滤器 
 -  
 - @author xy 
 -  
 */  
public class EncodingFilter implements Filter  
{  
    private String encoding;  

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

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception  
    {  
        HttpServletRequest httprequest = (HttpServletRequest) request;  
        if ("GET".equals(httprequest.getMethod()))  
        {  
            // 将httpRequest进行包装  
            EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);   
            chain.doFilter(wrapper, response);  
        }  
        else  
        {  
            request.setCharacterEncoding(encoding);  
            response.setContentType("text/html;charset=" + encoding);  
            chain.doFilter(request, response);  
        }  
    }  

    public void destroy()  
    {  

    }  

}  


/** 
 - httpRequest进行包装类 
 -  
 - @author xy 
 -  
 */  
public class EncodingHttpServletRequest extends HttpServletRequestWrapper  
{  
    private HttpServletRequest request;  
    private String encoding;  

    public EncodingHttpServletRequest(HttpServletRequest request)  
    {  
        super(request);  
        this.request = request;  
    }  

    public EncodingHttpServletRequest(HttpServletRequest request,String encoding)  
    {  
        super(request);  
        this.request = request;  
        this.encoding = encoding;  

    }  
    @Override  
    public String getParameter(String name)  
    {  
        String value = request.getParameter(name);  
        if (null != value)  
        {  
            try  
            {  
                // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串  
                value = new String(value.getBytes("ISO8859-1"), encoding);  
            }  
            catch (UnsupportedEncodingException e)  
            {  
                e.printStackTrace();  
            }  
        }  
        return value;  
    }  

}  
<filter>  
  <display-name>EncodingFilter</display-name>  
  <filter-name>EncodingFilter</filter-name>  
  <filter-class>cn.xy.filter.EncodingFilter</filter-class>  
  <init-param>  
    <description></description>  
    <param-name>encoding</param-name>  
    <param-value>UTF-8</param-value>  
  </init-param>  
</filter>  
<filter-mapping>  
  <filter-name>EncodingFilter</filter-name>  
  <url-pattern>/*</url-pattern>  
</filter-mapping> 

方法三:修改Tomcat容器的编码

默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码:<
Connector port=”8080” protocol=”HTTP/1.1” connectionTimeout=”20000”
redirectPort=”8443” /> 这段代码规定了Tomcat监听HTTP请求的端口号等信息。
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
修改完成后:< Connector port=”8080” protocol=”HTTP/1.1”
connectionTimeout=”20000” redirectPort=”8443” URIEncoding=”UTF-8” />

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值