浅谈java web开发中的乱码问题的解决

直接上在工作中遇到的问题吧:

在springmvc的项目中 前台表单通过get请求发送的中文在后台接收后出现乱码

于是我配置了一个spring的过滤器

org.springframework.web.filter.CharacterEncodingFilter

但是仅仅处理了post请求的中文乱码问题,网上说有一种简单的方法就是修改tomcat的server.xml文件,但是这个方法也太部靠谱了吧,还是另想他发吧!

于是我就着手写一个Filter去处理乱码问题 通过包装

javax.servlet.http.HttpServletRequestWrapper

类 重写request中获取参数的方法并对参数进行重编码来解决问题,应该没问题吧,可是搞了半天竟然还没起作用,我在Filtter中

chain.doFilter(...)

前后各打印请求参数,显示转码成功了呀, 怎么回事?。。。

经过一时思考,原来是处理逻辑有问题,在程序中没有做是否转过码的判断,导致有可能在springmvc的自动装载请求参数的过程中可能把我已经转过码的参数再次转码 这样肯定不行啦!!

下面把代码贴出,注意的地方标红吧:

/**
 * 对请求和响应的数据进行编码
 * 
 * @author aracwong
 * 
 */
public class CharacterEncodingFilter implements Filter {

	public static final String PARAM_ENCODING_NAME = "encoding";
	public static final String UTF_8 = "UTF-8";
	public static final String ISO_8859_1 = "ISO-8859-1";

	private String encoding = CharacterEncodingFilter.UTF_8;

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest requ = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		request.setCharacterEncoding(CharacterEncodingFilter.UTF_8);
		response.setCharacterEncoding(CharacterEncodingFilter.UTF_8);
		// 使用包装类
		MyHttpServletRequest myrequest = new MyHttpServletRequest(requ);
		chain.doFilter(myrequest, resp);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		String _encoding = filterConfig
				.getInitParameter(CharacterEncodingFilter.PARAM_ENCODING_NAME);
		if (StringUtils.isNotBlank(_encoding)) {
			encoding = _encoding;
		}
	}

	private class MyHttpServletRequest extends HttpServletRequestWrapper {
		private HttpServletRequest request;

		private boolean flag = false;

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

		@Override
		public String getParameter(String name) {
			Map<String, String[]> map = getParameterMap();
			if (map != null) {
				String[] values = map.get(name);
				if (values != null) {
					return values[0];
				}
			}
			return null;
		}

		@Override
		public String[] getParameterValues(String name) {
			Map<String, String[]> map = getParameterMap();
			if (map != null) {
				String[] values = map.get(name);
				if (values != null) {
					return values;
				}
			}
			return null;
		}

		@Override
		public Map<String, String[]> getParameterMap() {
			if ("post".equalsIgnoreCase(request.getMethod())) {
				// post方式提交
				try {
					request.setCharacterEncoding(encoding);
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				return request.getParameterMap();
			} else {
				// get方式提交
				Map<String, String[]> paramMap = request.getParameterMap();
				if (!flag) {
					for (Map.Entry<String, String[]> me : paramMap.entrySet()) {
						String[] values = me.getValue();

						for (int i = 0; i < values.length; i++) {
							try {
								values[i] = new String(
										values[i]
												.getBytes(CharacterEncodingFilter.ISO_8859_1),
												encoding);
							} catch (UnsupportedEncodingException e) {
								e.printStackTrace();
							}
						}

					}
					flag = true;
				}
				return paramMap;
			}
		}
	}

	public void destroy() {

	}
}

一下这个代码非常有必要:如果这个请求对象已经被转过码,下次调用取请求参数的时候做个判断,就不再转码了,不然转过码的UTF-8数据 再以ISO8859-1取字节 在转换成UTF-8肯定会报错咯,真是个宝贵的错误经验

private boolean flag = false;
时间: 2024-11-01 20:42:08

浅谈java web开发中的乱码问题的解决的相关文章

Java Web 开发中路径相关问题小结

Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同级目录:http://localhost:8080/test/articles/article1.jsp和http://

日常 java web 开发中遇到的常见问题

view 层: 问题:jsp 页面double 值过大,会变成科学计数法 第一步:引入标签 <%@ taglib prefix= "fmt" uri ="/WEB-INF/tld/fmt.tld" %> 第二步: <fmt:formatNumber value= "${变量名} " pattern="#.00"/> 2.jsp和java后台交互,通过js 转码问题 js代码:       var tes

java web开发中的奇葩事web.xml中context-param中的注释

同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步删除同事提交的代码,进行还原. 奇葩事情出现了! <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/context_entry.xml

web开发中的乱码问题

乱码问题的根源:(以web程序为例子,eclipse来查看编码,设置UTF-8) 解决方案:所有文件或者字符串的编码方式一致 (1)查看web页面文件的编码方式:        (2)web页面的<head>写上          <meta http-equiv="content-type" content="text/html; charset=UTF-8"> (3)特别注意web里面的<form>提交时submit,带有中文

java web开发中,如何查看JSP和Servlet版本 (转)

原文出处:http://blog.163.com/qiu_yin_good/blog/static/16732934920123277481492/ 在看<struts2权威指南>的时候,书上很多处都提到环境要支持的JSP,Servlet版本.如果版本低,会出现异常.或者需要修改web.xml等. 现在记录下如何看自己java  web工程的JSP和servlet版本. 我的tomcat版本是7.0.26 方法:打开tomcat/lib,找到jsp-api.jar和servlet-api.ja

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

浅谈移动Web开发(上):深入概念

PPI 什么是PPI PPI的复杂之处在于如果他所属的上下文环境不同,意义也会完全不一样. 当我们在谈论显示设备的PPI时,它代指的屏幕的像素密度:当我们在谈论和图片相关时,我们谈论的是打印时的分辨率或者打印机的打印精度.这里我们主要描述的前一种情况. PPI全称为Pixel Per Inch,译为每英寸像素取值,更确切的说法应该是像素密度,也就是衡量单位物理面积内拥有像素值的情况. 如上图所示,在1英寸单位内面积内拥有的像素越多,密度越大,PPI值就越高.但像素密度的实际意义是什么?它表达的是

Java Web开发中路径问题小结

看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http://localhost:8080/ 2. web应用程序的的根目录:http://localhost:8080/test/ 3.同

Java web开发中主要用到的jar包

1.Java开发中主要用到的jar包介绍:(1)java JDK基础开发包:java包和javax包.书写方式:import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; 1.java.util包:集合类list/set/map等接口和实现类.calendar,date日期操作类.properties读取配置文件类.random随机数类.Timer计时器类.