JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器

简介:

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是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>
目录
相关文章
|
6月前
|
应用服务中间件
tomcat服务器get、post请求及响应中文乱码问题
tomcat服务器get、post请求及响应中文乱码问题
|
前端开发 应用服务中间件 Android开发
用SpringMVC参数传递时,解决get请求时中文乱码的问题
用SpringMVC参数传递时,解决get请求时中文乱码的问题
|
Java 应用服务中间件 API
【Servlet篇】如何解决Request请求中文乱码的问题?
【Servlet篇】如何解决Request请求中文乱码的问题?
512 0
|
JSON 前端开发 Java
SpringMVC:请求乱码问题处理和json乱码解决方案
SpringMVC:请求乱码问题处理和json乱码解决方案
SpringMVC:请求乱码问题处理和json乱码解决方案
SpringMVC - 过滤器之中文乱码
SpringMVC - 过滤器之中文乱码
93 0
JavaWeb - 过滤器之乱码
JavaWeb - 过滤器之乱码
121 0
|
JSON 数据格式
搭建一个包含多种Get请求和Post请求的工具类
在工作的过程中经常会遇到需要调用接口的场景,用得多了就写了一个请求的工具类,以后再遇到需要Get请求或者Post请求的情况直接调用就行。
|
Java 应用服务中间件 容器
JSP和Servlet的六种中文乱码处理方法
JSP和Servlet的六种中文乱码处理方法
270 0
|
Java 应用服务中间件 程序员
struts2.2.3 配置中文乱码拦截过滤器 解决接收中文参数乱码问题
java 编程中得中文乱码问题,一直都是个困扰程序员的问题。
203 0
|
应用服务中间件
SpringMVC请求乱码
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
589 0