JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器-阿里云开发者社区

开发者社区> 徐胖子> 正文

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

简介: 一、乱码原因 ①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。 ②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)   二、解决办法 方法一 每次传输都手动设置编码(GET方式传输数据) 传输方 String name =
+关注继续查看

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是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>

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
艾伟也谈项目管理,ERP项目实施要未雨绸缪不要亡羊补牢
  在ERP项目中,要做到在项目实施的未雨绸缪,不会出现亡羊补牢的情况就需要项目管理和实施人员在项目推进过程中队下面的阶段进行预测,把握好发展的趋势,掌握项目的主动权。下面就提出一些建议,供大家讨论。希望对大家有用。
758 0
.NET项目web自动化测试实战——Selenium 2.0
PS:这次用公司的项目来练手,希望公司不会起诉我,因为我绝对是抱着学习的态度,没有任何恶意。仅供交流学习。 该项目是基于SharePoint平台所开发的门户网站,为了切身感受一下Selenium 2.0我决定自己动手写一个自动化测试用例,而不是通过录制的方式,以加深我对一些web操作的理解。
683 0
利用 LibWebP-NET 解码与编码 WebP 格式图片
原文:利用 LibWebP-NET 解码与编码 WebP 格式图片 WebP 格式是谷歌开发并发展的一种最新的网络图片格式,具有压缩率高、解码快、免版权、开源等优点。 大部分先进的网页浏览器、图片浏览器都支持该格式,Windows用户可以通过安装 WebP Codec for Windows 在系统中查阅WebP图片。
1666 0
jQuery EasyUI API 中文文档 - 树表格(TreeGrid)
TreeGrid 树形表格 扩展自 $.fn.datagrid.defaults,用 $.fn.treegrid.defaults 重写了 defaults。 依赖 datagrid 用法 1.
1017 0
Java Groovlets和普通的Web项目集成
由于Groovy动态语言的方便性,如果想在普通的web项目中集成有两个选择 使用基于groovy的Grails框架,非常的方便,适用于新建的项目 使用groovy本身集成,适用已有项目的维护(毕竟按照grails的约定升级一个项目对于大的项目还是有很多的工作量的) 下文把实际涉及的一个项目维护使用groovy的过程总结一下: Web.
731 0
java.net.MalformedURLException: Local host name unknown报错处理
linux 修改host后启动tomcat报错 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.
2209 0
Asp.net MVC 2 + Castle + NHibernate 项目实战(1)
本文将开始一步一步地使用Asp.net MVC 2 + Castle + NHibernate 开发一个项目。   在开始之前,我先对这三个组件做一个简单的介绍:  Asp.net MVC  它是微软提供的一个基于MVC标准的Web开发模式,其典型特点是有控制器和视图;在这之前,.NET下的Web开发模式大多是采用WebForm,其典型特点是服务端控件和后台触发事件;   NHibernate 它是一个ORM框架,使用Java的SSH做过项目开发的人就非常熟悉了,当前最新版本为NHibernate 3.0,听说完全支持Linq查询语句了,以前只支持HQL语句。
723 0
+关注
515
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载