`
tanzhen-1988
  • 浏览: 52694 次
  • 性别: 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"); 


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

分享到:
评论

相关推荐

    CharacterEncodingFilter类的学习 .doc

    `CharacterEncodingFilter` 类是 Spring 框架中用于处理 Web 应用程序字符编码问题的一个过滤器。在处理 HTTP 请求时,如果前端 JSP 页面和后端 Java 代码使用了不同的字符集,可能会导致数据乱码问题,尤其是在表单...

    字符编码工具类CharacterEncodingFilter.java

    字符编码工具类CharacterEncodingFilter.java 字符编码工具类CharacterEncodingFilter.java 字符编码工具类CharacterEncodingFilter.java

    spring-web-2.5.jar

    org.springframework.web.filter.CharacterEncodingFilter.class org.springframework.web.filter.CommonsRequestLoggingFilter.class org.springframework.web.filter.DelegatingFilterProxy.class org.spring...

    spring boot xss防御

    - 使用`CharacterEncodingFilter`确保所有请求和响应都使用UTF-8编码,防止乱码问题,同时也对输入进行规范化处理。 - `HttpPutFormContentFilter`可以确保PUT请求的内容以表单形式解析,便于进一步的验证和处理。...

    一个基于SSMM(SpringMVC+ Spring + Mybatis + Redis + Maven)的练手Demo.zip

    Spring CharacterEncodingFilter 过滤器; 使用Mybatis作持久层(ORM)框架:以面向对象的方式对PO类的操作映射成为对应的持久化操作; 使用Mybatis的Mapper映射器(Mappper接口); 使用Maven进行项目构建和依赖管理; ...

    Spring MVC 入门实例

    22 &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter 23 24 &lt;param-name&gt;encoding 25 &lt;param-value&gt;UTF-8 26 27 28 29 30 &lt;filter-name&gt;encodingFilter 31 *.do 32 33 34 35 ...

    Spring在web中使用

    6. **Filter**:Spring还提供了一些Filter,如CharacterEncodingFilter用于设置字符编码,HttpPutFormContentFilter帮助处理PUT请求的表单数据。 7. **WebSocket支持**:自Spring 4.0开始,Spring Web模块包含了对...

    spring学习过程中遇到的问题和解决,eclipse使用

    2. **配置Spring的编码过滤器**:这是一种更常用的解决方法,可以在`web.xml`文件中添加Spring的`CharacterEncodingFilter`来强制客户端和服务器之间传递的数据采用统一的编码格式(例如UTF-8)。这样可以确保所有的...

    spring2.5学习PPT 传智博客

    - 利用CharacterEncodingFilter和OpenSessionInViewFilter解决编码问题。 通过以上内容的学习,开发者可以深入理解Spring 2.5的核心概念,掌握其在实际开发中的应用,从而提高工作效率和代码质量。

    用SpringSecurity保护Web的安全

    - 添加`CharacterEncodingFilter`以处理字符编码问题,确保所有输入数据正确编码为UTF-8。 配置`spring-security.xml`时,需要定义访问规则、用户信息源(可以是非数据库方式,如内存或属性文件)和登录认证逻辑。...

    Spring提供的CharacterEncoding和OpenSessionInView功能

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

    SpringSecurity3.1实际摸索总结

    2. 定义 `CharacterEncodingFilter`,确保所有请求和响应使用 UTF-8 编码。 3. 配置 `spring-security.xml`,定义安全规则,如访问控制、认证机制等。 在 `spring-security.xml` 中,你可以使用 `&lt;http&gt;` 元素定义 ...

    MyBatis 3 整合Spring3、SpringMVC

    - 添加字符编码过滤器`CharacterEncodingFilter`,确保请求和响应的编码一致。 4. **配置Spring MVC的dispatcher.xml**: - 这个文件通常位于`WEB-INF`目录下,用于定义Spring MVC的组件和行为。内容可能包含视图...

    Struts,Spring与hibernate集成

    9. **解决中文乱码问题**:Spring提供了CharacterEncodingFilter,只需简单配置就能处理HTTP请求的编码问题,确保中文字符正确显示。 10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求...

    spring-boot 过滤器 filter

    Filter的生命周期由Servlet容器管理,包括初始化、服务和销毁三个阶段。初始化时,容器会调用`init()`方法;每当有请求匹配到过滤器时,会调用`doFilter()`方法;当应用停止或服务器关闭时,会调用`destroy()`方法。...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    这段代码指定了一个Listener类`ContextLoaderListener`,该类由Spring框架提供,用于在应用程序启动时加载Spring的上下文配置。 #### Filter Filter是在请求到达目标资源之前可以执行预处理操作的对象,并且在响应...

    spring 教程。。。

    这种设计使得代码更简洁,更易于理解和测试,因为对象间的依赖关系由Spring来管理和维护。 Spring的面向切面编程(AOP)是另一个亮点。AOP允许我们将横切关注点(如日志、事务管理、安全性)从核心业务逻辑中分离...

    关于Mybatis与Spring、SpringMVC整合的简单web工程

    同时,我们还需要配置过滤器,如CharacterEncodingFilter,以确保请求和响应的编码统一。 此外,为了实现Mybatis与Spring的无缝集成,我们通常会使用Mybatis的Spring支持,这将帮助我们管理SqlSession,并通过...

    Spring+SpringMVC+MyBatis所需jar包(全部)

    - 解决Ajax中JSON中文乱码问题,通常需要设置Tomcat的字符编码,以及在Servlet容器中配置过滤器,如`CharacterEncodingFilter`,确保请求和响应的编码一致。 5. **jar包说明**: 压缩包中的jar包涵盖了Spring、...

    spring+springMVC+Mybatis框架整合

    - `&lt;filter&gt;`和`&lt;filter-mapping&gt;`用于设置字符编码过滤器`CharacterEncodingFilter`,确保请求和响应的字符编码为UTF-8,避免乱码问题。 - `&lt;context-param&gt;`和`&lt;listener&gt;`用于初始化Spring的全局上下文,`...

Global site tag (gtag.js) - Google Analytics