刚才前一篇已经讲了处理乱码的一种方法,我并不想单独用拦截器的方式来处理,那样每一个action就要加一个interceptor,且对每个都要重新转码一次.于是就想从filter入手来解决,让他本身就以utf-8的方式从客户端一直到action.在先前的setCharacterFilter里面,看到这样一个东西.
if(ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if(encoding != null) {
request.setCharacterEncoding(encoding);
}
}
这里,得到的encoding默认是GBK,在接下来,if(encoding != null),我想如果将encoding改为null,那就不会执行request.setCharacterEncoding(encoding)了,那就不会出乱码了吧.说改就改,改selectEncoding(request)这个方法.
protected String selectEncoding(ServletRequest request) {
if(request.getParameter("ajax") != null)
return null;
return this.encoding;
}
编译运行,处理ajax请求,好像通过了.ajax编码终于正确了,运行了一段时间,以为问题就解决了.还没有一会儿,另一个测试的同学来跟我说,jsp又出乱码了,跑过去一看,果然是乱码.好像是post乱码了.用request.getParameter来做,还是乱码.应该是拦截器这儿出问题了,跑到filter里面,对request.getCharacter进行输出,发现在没有改变编码之前,它的默认编码是ISO-8859-1,而改变之后确实是GBK啊.这是怎么回事,我已经将encoding改为GBK了,怎么会没反应.将参数进行一将ISO-8859-1到GBK转换,参数正确了.可这样不行啊,难道是我的selectEncoding有问题,将先前没有改过的方法进行替换,结果又能正确的解析参数了(可惜ajax乱码).
决定看tomcat源代码,找到这一段中,对request.getParameter进行查询,结果发现这么一段
public String getParameter(String name) {
if (!parametersParsed)
parseParameters();
return coyoteRequest.getParameters().getParameter(name);
}
return 这一名后面应该是对参数进行map.get方法,那前一句肯定有问题了,转向前一句:
protected void parseParameters() {
parametersParsed = true;
Parameters parameters = coyoteRequest.getParameters();
String enc = getCharacterEncoding();
......
}
这个访求将parametersParsed置真,那么,如果这个为真的话,那么这个方法就不会被执行,也就是说,再不会进行转码操作.parseParameters只会被进行一次,也就是说,如果我调用了,getParamters这个方法之后,再进行setCharacterEncoding方法,将不会对parseParameters方法有任何影响,因为这个方法已经被执行了,而依据的编码是之前的旧的编码.在上面那个selectEncoding中,我执行了一个request.getParameters()方法,相关的编码已经固定下来了,所以接下来的编码都不会对参数的编码问题有影响.所以,在执行编码设置之前,不能调用任何getParameters()方法,可能还有其他方法(暂时不管其他的).这就难办了.
忽然想看看,ajax调用之前的编码是什么,结果打印出来结果为UTF-8,而对jsp之前的编码进行打印时,却是null.仔细看了下,doFilter之个方法,还有那个if语句.很简单,如果request.getCharacterEncoding()不为空时,是可以不用再设置编码为GBK了,而当为null时,则可以设置编码.再仔细看了下这个ignore参数,它现在默认是true,也就是说,如果它为true,那都会强制进行设置编码操作,于是一个新的办法出来了.将ignore设置为false,每次设置编码由request来决定,如果编码为null则设置为GBK,否则就按已经设置好的编码(如ajax的UTF-8)进行.
因此将selectEncoding改回去,原来的不变,然后在web.xml中,对setCharacterEncoding的初始化参数进行修改,将ignore改为false,这样整个问题就解决了.
事后看了下这个问题,其他也很简单的,就是修改一个ignore参数的问题,然而却费了这么长的时间.原因还是自己对这个问题不太明白,以前看ignore这个参数觉得没什么用嘛,原来在这些问题还发挥了作用,最后还去看源代码,本来很简单的一件事,费这么大功夫,虽然有点不值,还算是买了个念像,以后碰到这个问题应该就不会再出问题了.
Fly_m 记.
分享到:
相关推荐
在Web开发中,尤其是在使用Java与JSP技术栈进行开发时,经常会遇到的一个问题是:如何处理AJAX请求中的中文字符乱码问题。本篇文章将详细介绍如何通过前端编码处理、后端参数接收以及响应头设置等手段来有效解决这一...
针对java web开发方面中文乱码情况的总结,基本各种情况都有了!
Ajax乱码问题主要涉及到字符编码的处理,包括服务器端、客户端以及文件的编码设置。解决Ajax乱码问题的关键在于确保整个数据传输链路上的编码一致性。 1. **字符编码** - **UTF-8**:广泛使用的编码格式,支持多种...
总的来说,解决Ajax乱码问题的关键在于理解字符编码的工作原理,确保数据在整个传输过程中的编码与解码一致性,以及正确设置服务器和客户端的编码设置。在实际应用中,还应考虑跨平台和跨浏览器的兼容性,以确保解决...
综上所述,解决JSP中Ajax GET请求的中文乱码问题需要从服务器配置、Servlet处理、JSP页面编码和Ajax请求等多个角度综合考虑,并进行相应的调整。通过这些步骤,可以有效地避免并解决中文乱码问题,保证数据传输的...
综上所述,解决AJAX乱码的关键在于全栈编码一致性管理,从文件编码、请求响应处理到资源文件编码,每一个环节都需要严格遵循同一编码标准,特别是UTF-8,以确保中文字符在传输过程中的正确无误。
【Struts和Ajax乱码解决方案】 在Web开发中,乱码问题始终是一个常见的困扰,特别是对于使用Struts和Ajax技术的开发者来说。乱码问题主要出现在数据的输入、传输和展示过程中,涉及到编码格式的选择和一致性。以下...
总结来说,解决Ajax乱码问题主要涉及服务器端的编码设置、客户端的请求和响应处理以及页面编码的一致性。通过正确配置和处理,可以避免乱码问题,确保数据的正确显示。同时,结合EJB等企业级技术,可以构建更强大的...
【Ajax乱码问题详解】 在Web开发中,Ajax(异步JavaScript和XML)技术被广泛应用于实现页面的无刷新更新,然而,与之相伴的一个常见问题是字符编码导致的乱码现象。本文将深入探讨Ajax乱码问题的成因及其解决方案。...
在本文中,我们将深入探讨如何解决使用Ajax进行POST请求时出现的中文乱码问题。首先,我们要理解Ajax中文乱码的根源,它通常涉及到字符编码的不一致,尤其是在客户端与服务器之间的通信过程中。 Ajax(Asynchronous...
在Java Web开发中,JSP乱码和AJAX的应用是两个常见的主题。本文将深入探讨这两个话题,提供解决方案,并给出详尽的实践指导。 首先,让我们来解决JSP项目的乱码问题。乱码通常是由于编码不一致导致的,尤其是在处理...
在AJAX与JSP的结合中,JSP作为服务器端技术负责处理业务逻辑和数据处理。JSP可以使用Java脚本来处理请求,执行数据库查询、计算或其他任何需要的任务,然后将结果以适合AJAX请求的格式返回。例如,服务器端可能返回...
### JSP中文乱码问题最优解决方法 在Web开发中,特别是使用Java Server Pages(JSP)进行网页设计时,中文乱码问题是一个常见的技术挑战。本文将详细探讨如何有效地解决JSP页面中的中文乱码问题,并提供具体的解决...
Ajax URI 乱码问题主要涉及浏览器差异和服务器配置两方面,尤其在处理非 ASCII 字符时,编码格式的不一致可能导致乱码。以下是对这个问题的详细解析和解决方案: 1. **浏览器差异**: - **Internet Explorer (IE)*...
JSP中的AJAX GET请求的中文乱码问题主要是由于URL编码格式不匹配导致的。以下是一些解决此问题的关键点和步骤: 1. **URL编码格式**: 默认情况下,Tomcat服务器使用ISO-8859-1编码处理URL,这是因为在`server.xml...
2. **JSP中的乱码处理**: - 页面编码:在JSP文件顶部添加`;charset=UTF-8"%>`设定页面编码。 - 请求参数:使用`request.setCharacterEncoding("UTF-8")`设定请求的编码。 - 响应编码:通过`response....
在实际应用中,我们常常会遇到Ajax与服务器交互时出现中文乱码的问题,尤其是在发送和接收中文数据时。这个问题主要涉及到字符编码的处理,解决起来需要对HTTP协议、字符编码原理以及Struts框架的工作机制有一定的...
一个Ajax的初学小例子,包括两个文件,getText.html,zipecode....在zipecode里输入1,2,3会从jsp里读取对应的city和prov并放到对应的文本框里。并且做了中文处理,输入“徐家汇”会得到邮编等。在Tomcat6下测试通过。
在JSP中使用AJAX的GET请求时,经常会出现中文乱码问题。这种乱码问题通常是由于字符编码不一致导致的。由于HTTP协议本身不包含字符编码信息,服务器和浏览器通常会采用默认的编码方式来处理请求和响应数据,如果默认...