由spring的CharacterEncodingFilter引发的问题

2 篇文章 0 订阅
1 篇文章 0 订阅

大牛的spring框架的字符编码过滤器CharacterEncodingFilter使用起来挺不错的。虽然自己可以写类似的过滤器,但是还是不要“重复发明轮子”了吧。

今天上午调试程序的时候,突然遇到一个问题。项目中有一个模块,要实现信息搜索功能,页面展现提供了两个输入框,根据操作员填写的信息搜索。

本来为了测试方便,我一直是输入英文字母进行测试。没有发现问题。但是,输入中文测试,却检索不到对应的信息了。查看了一下tomcat后台的hibernate打印的sql语句:

Hibernate: select count(t.PUBLIC_NEWS_ID) from TBL_PUBLIC_NEWS t where 1=1 and t.NAME='??' 

让人头疼的乱码问题又出现了。


先从前台开始排查原因:


排查原因之前,需要明确一个问题:

在默认情况下,浏览器发送的HTTP请求采用“ISO-8859-1”字符编码。当HTTP请求以POST方式发出时,请求参数位于请求正文中。

而当HTTP请求以GET方式发出时,请求参数位于请求头的URI中。

同时需要知道spring的CharacterEncodingFilter的过滤机制。附该过滤器的源码:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {


if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);//===================================这行代码决定了过滤器的过滤机制。

//这行代码只会对请求正文进行编码,这对于POST方式的请求有效;

//当请求方式为GET时,需要的参数位于请求头的URI中,不会受到该行代码影响。

//所以,spring的CharacterEncodingFilter对于GET方式的HTTP请求,无能为力。
if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}


那么既然spring的CharacterEncodingFilter对GET方式的HTTP请求无能为力,我们必须找到能够过滤GET方式请求的办法啊。问一下谷歌老师吧:

搜索了一大堆,综合一下,大概有两种解决办法:

第一种:修改tomcat的配置文件:conf/server.xml 找到connector节点,修改如下:

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="GBK"/>

第二种:类似于如下代码:

$.getJSON("yuanChengYanZhen!qingDanMingCheng.do?qingDanName="+encodeURI(qingDanName,"gbk"),function(result){});

然后在后台解码传入的参数:

String name=URLDecoder.decode(request.getParameter("qingDanName"),"gbk"); 


///以上两种方式我试了第一种,可行。


所以,知道了上述的关键点后,可以分析乱码原因了。


以下操作都是以采用第一种方式为前提的。


我的搜索是采用的jquery的getJSON方法执行的,把操作员的输入信息处理成要传入后台的数据,先上代码:

 $.getJSON("suggestion_search1.action",
{"tblPublicNews.newsCategoryId":newsObj.categoryId,
"tblPublicNews.name":newsObj.name),
"tblPublicNews.newsKeyword":newsObj.keyword),
"pagination.currentPage":pagination.currentPage,
"pagination.allPageNum":pagination.allPageNum,
"pagination.allRecordsNum":pagination.allRecordsNum,
"pagination.operateFlag":pagination.operateFlag}

function(data){

//处理数据

});

紫红色字体部分是需要传入后台的参数。这是我原来的写法。这样写,传递英文字符参数没问题。但是传递中文就不行了。


虽然参数能够传入后台,但是tomcat的URIEncoding同样起不了作用。

后来改为了这样的写法:

var url = "suggestion_search1.action?"
.concat("tblPublicNews.newsCategoryId=")
.concat(newsObj.categoryId)
.concat("&tblPublicNews.name=")
.concat(newsObj.name)
.concat("&tblPublicNews.newsKeyword=")
.concat(newsObj.keyword)
.concat("&pagination.currentPage=")
.concat(pagination.currentPage)
.concat("&pagination.allPageNum=")
.concat(pagination.allPageNum)
.concat("&pagination.allRecordsNum=")
.concat(pagination.allRecordsNum)
.concat("&pagination.operateFlag=")
.concat(pagination.operateFlag);

$.getJSON(url,function(data){});

可行。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值