Ajax Post请求中文乱码问题解决方案

前端之家收集整理的这篇文章主要介绍了Ajax Post请求中文乱码问题解决方案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
本文介绍解决ajax post中文乱码的问题的方案,如果你的web应用中全部使用utf-8编码,那将不会有这上问题。这里主要是解决那些要求页面编码是gbk或 gb2312等非utf-8编码(有时候由于历史遗留问题,就会有这种需求)的web应用遇到的ajax post中文乱码问题。
通常,对于这个问题有三种解决方法

  • 通过前端页面在ajax post数据时把数据使用encodeURIComponent方法编码两次,后台以utf-8编码取出,使用 java.net.URLDecoder.decode方法解码一次后即可取得正确的数据。----这种方式网上见到的最多,但这样做前端和后台的藕合太 大,而且后台加入的这个解码用的代码与业务逻辑无关,却可能要写在业务逻辑的代码里,显然不是个很好的方案。由其对于大的系统来说,必须跟前端和后台的开 发人员协调好,否则容易出现问题。
  • 第二种方案,比第一次方案前后台的藕合要小,类似于命令模式。通过一个Filter,根据请求的url中的标记用参数来判断是否要把request的编码设置为UTF-8,可以参考我的另一篇博客http://hjg1988.iteye.com/blog/467715。----这个方案是通过前台后台发出一条命令来告诉后台对编码进行处理,对前台的要求降低了。注意其中后台是通过request.getQueryString方法而不是getParameter方法来判断是否含有标记
  • 第三种方案就是我要介绍的方案,与第二种相同,主要问题就是如何让后台知道这是一个ajax post请求,而不是普通的请求。之前因为不知道如何在后台知道前台发来的请求是ajax post的,所以要求前台发出一个命令。而这个方案是我在看到了http://www.iteye.com/topic/336790这个帖子后才知道还有这种方式可以知道是否是一个ajax post请求。下面是我修改过后的方案:


  • Java代码
    @H_404_30@
  • packagecom.hjg.demo.filter;
  • importjava.io.IOException;
  • importjavax.servlet.Filter;
  • importjavax.servlet.FilterChain;
  • importjavax.servlet.FilterConfig;
  • importjavax.servlet.ServletException;
  • importjavax.servlet.ServletRequest;
  • importjavax.servlet.ServletResponse;
  • importjavax.servlet.http.HttpServletRequest;
  • /**
  • *针对ajaxpost请求进行编码设置,因为Ajaxpost请求总是UTF-8的,<br/>
  • *这有可能与应用程序的整体编码设置不一致(由需求决定,比如所有页面<br/>
  • *统一使用GBK),所以如果不加处理可能会造成中文乱码。<br/>
  • *这个Filter不对应用程序的整体编码进行过滤,即不会影响整体编码设置<br/>
  • *(Web框架会对编码进行设置),只需要把这个Filter配置在所有Filter之前<br/>
  • *
  • *@authorjinggang.huangjg
  • *
  • */
  • publicclassAjaxPostEncodingFilterimplementsFilter{
  • /**ajaxpost请求的默认contenttype*/
  • publicstaticfinalStringAJAX_POST_CONTENT_TYPE_DEFAULT="application/x-www-form-urlencoded";
  • /**ajaxpost请求的编码,W3C标准为UTF-8*/
  • publicstaticfinalStringAJAX_POST_ENCODE="UTF-8";
  • privateStringajaxPostContentType;
  • publicvoiddoFilter(ServletRequestreq,ServletResponseres,
  • FilterChainchain)throwsIOException,ServletException{
  • HttpServletRequestrequest=(HttpServletRequest)req;
  • StringrequestedWith=request.getHeader("x-requested-with");
  • StringcontentType=request.getContentType();
  • //表明是一个Ajax的post请求,并且不是使用隐藏的iframe实现的
  • if("XMLHttpRequest".equalsIgnoreCase(requestedWith)&&null!=contentType
  • &&contentType.toLowerCase().startsWith(ajaxPostContentType.toLowerCase())){
  • request.setCharacterEncoding(AJAX_POST_ENCODE);
  • /*
  • *调用getParameter方法可以让在此之后调用的setCharacterEncoding方法失效,
  • *参数可以为任何值(canbeanything)
  • *可以防止WEB框架或用户程序再次将其设置回GBK等其它编码,
  • *因为有些情况下,用户的要求的页面编码不是UTF-8而是GBK或其它的
  • */
  • request.getParameter("canbeanything");
  • }
  • chain.doFilter(req,res);
  • }
  • publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  • ajaxPostContentType=filterConfig.getInitParameter("ajaxPostContentType");
  • if(null==ajaxPostContentType){
  • ajaxPostContentType=AJAX_POST_CONTENT_TYPE_DEFAULT;
  • }
  • }
  • publicvoiddestroy(){
  • }
  • }

  • 这是web.xml的配置:
    Xml代码
    @H_404_30@
  • <filter>
  • <filter-name>ajax-post-encoding</filter-name>
  • <filter-class>com.hjg.demo.filter.AjaxPostEncodingFilter</filter-class>
  • <!--
  • 以下配置可以省略,ajaxPostContentType默认为application/x-www-form-urlencoded,
  • 除非你的ajaxpost请求设置了不同的contentType
  • -->
  • <!--
  • <init-param>
  • <param-name>ajaxPostContentType</param-name>
  • <param-value>application/x-www-form-urlencoded</param-value>
  • </init-param>
  • -->
  • </filter>
  • 这个方案就对前端没有任何要求,在使用ajax post数据时,不需要做任何处理(当然,前提是你要把contentType设置为application/x-www-form-urlencoded——不过在ajax post数据时本身就应该有这个要求)。 原文链接:https://www.f2er.com/ajax/162832.html

    猜你在找的Ajax相关文章