`
tanzhen-1988
  • 浏览: 53019 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

由spring的CharacterEncodingFilter引发的问题 (转)

阅读更多

大牛的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"); 


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

分享到:
评论

相关推荐

    Spring提供的CharacterEncoding和OpenSessionInView功能

    在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`OpenSessionInViewFilter`,它们对于解决特定问题至关重要。 首先,让我们深入了解一下`CharacterEncodingFilter`。在Web应用中,字符...

    SpringMVC解决GET请求时中文乱码的问题.rar

    在Spring MVC框架中,处理HTTP GET请求时遇到中文乱码问题是一个常见的开发难题。这个问题主要源于请求参数在URL中编码时使用的是UTF-8以外...在实际开发中,我们应养成良好的编码习惯,减少因字符编码问题引发的困扰。

    Hibernate+Spring+Struts2+ExtJS开发CRUD功能.doc

    此外,文档还包含了字符编码过滤器(CharacterEncodingFilter)的配置,确保应用接收和发送的数据采用UTF-8编码,避免因字符集问题引发的乱码问题。最后,详细列出了`web.xml`的其他部分,虽然未完全展示,但可以...

    Struts+Spring+Hibernate补充内容

    例如,提到的`asm-2.2.3.jar`和`commons-collections-2.1.1.jar`文件就可能引发此类问题。 **解决方法:** - 首先确认项目中是否确实需要这两个特定版本的jar包。 - 如果项目并不依赖于这些版本,建议删除Tomcat...

    SSH整合配置注意点

    - 通过setter注入的方式,由Spring自动注入Bean,如: ```java private UserDAO dao; public void setDao(UserDAO dao) { this.dao = dao; } ``` - 在Spring配置文件中定义Bean之间的关系: ```xml ...

    将_Shiro_作为应用的权限基础_五:SpringMVC+Apache_Shiro+JPA(hibernate)整合配置

    - **IntrospectorCleanupListener**:这是一个Spring提供的监听器,用于防止`java.beans.Introspector`类引发的内存泄漏问题。将其配置在`ContextLoaderListener`之前可以确保先清理再初始化Spring容器。 - **...

    SpringMVC——处理器方法参数的处理.docx

    但需要注意,由于控制器是单例的,直接注入`ServletContext`可能引发多线程安全问题,因此通常不推荐这种做法。 2. **简单类型参数**: - 当请求参数与处理器方法的参数名称相同时,Spring MVC会自动将请求参数值...

    JavaWeb基础学习中处理中文乱码(踩过的坑)

    &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter &lt;param-name&gt;encoding &lt;param-value&gt;UTF-8 &lt;param-name&gt;forceEncoding &lt;param-value&gt;true &lt;filter-name&gt;...

Global site tag (gtag.js) - Google Analytics