今天在写程序时,前台利用GET方式向后端发出一个请求,里面含有中文数据,结果在后端显示的是乱码,此时就比较奇怪,spring里面也配了字符过滤器,却出现了乱码,所以就看了一下spring实现的该过滤器,下面是过滤器的实现代码
org.springframework.web.filter.CharacterEncodingFilter.java
public class CharacterEncodingFilter extends OncePerRequestFilter { private String encoding; private boolean forceEncoding = false; /** * Set the encoding to use for requests. This encoding will be passed into a * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call. * <p>Whether this encoding will override existing request encodings * (and whether it will be applied as default response encoding as well) * depends on the {@link #setForceEncoding "forceEncoding"} flag. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Set whether the configured {@link #setEncoding encoding} of this filter * is supposed to override existing request and response encodings. * <p>Default is "false", i.e. do not modify the encoding if * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()} * returns a non-null value. Switch this to "true" to enforce the specified * encoding in any case, applying it as default response encoding as well. */ public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } @Override 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方式的编码参数问题 if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }
在web.xml该过滤器是这样配置的
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
看了代码,才知道spring只是利用request.setCharacterEncoding(this.encoding);帮助我们处理了POST方式的乱码问题,碰到GET方式的提交,还是会出现乱码。
注意:自从Tomcat5.x开始,就对GET方式和POST方式的提交分别给予不同的处理方式。POST方式是利用request.setCharacterEncoding()来进行设置编码,如果没有设置的话,就是按照默认的ISO-8859-1来进行编码;GET方式提交总是利用默认的ISO-8859-1来进行编码参数。
所以碰到GET方式的提交就要利用一下的两种方式来解决中文乱码问题:
1.利用String
String username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); //通过默认的编码获取到byte[],然后进行UTF-8再次编码
2.在tomcat中的server.xml进行配置URIEncoding="UTF-8"
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
Ok,问题解决。
-----------------------------------------------------------------------------------------------------------------------------------
借着这会儿时间复习一下servlet/jsp乱码的问题
简述:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序与其他媒介交互产生的乱码问题。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成 class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecodingUTF-8或-ecoding 编译;对于JSP,在文件头加上UTF-8基本上就能解决这类乱码问题
1.Jsp页面呈现的在浏览器的三个阶段
第一阶段:第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段:第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
第三阶段:第三阶段是Tomcat(或其的application container)载入和执行阶段,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
2.Jsp/Servlet中处理乱码的四个地方
1. pageEncoding="UTF-8":负责第一个阶段,如果JSP中没有设置contentType="text/html;charset=UTF-8"的话,在tomcat中,服务器响应客户端时会使pageEncoding来设定;
2. contentType="text/html;charset=UTF-8":负责第三阶段应用服务器响应客户端时需要的编码
3. request.setCharacterEncoding("UTF-8"):是客户端请求数据到服务器时,为了不出现乱码,将在接受参数之前,将所有的请求参数,再转化为UTF-8的编码;
4. response.setCharacterEncoding("UTF-8"):服务器在响应客户端之前,对数据进行重新编码时,使用的就是该编码。
服务器接受数据主要有两种方式
注意:无论使用哪种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。当前浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。
处理方式以tomcat为例:
1.GET方式(包括超链接形式):GET方式使用request.setCharacterEncoding("UTF-8")是不行的,最简单的方式如下例:
String username = new String(request.getParameter("name).getBytes("ISO-8859-1"),"UTF-8");
2.POST方式:此种方式可以在服务器端接收参数之前,使用request.setCharacterEncoding("UTF-8")将数据重新编码,然后再使用
在项目中使用编码需要注意的问题:
以tomcat为例:
1.对于同一个应用,最好统一编码,推荐为UTF-8
2.正确设置JSP的pageEncoding参数
3.在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
4.对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF- 8")。同时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。
上面如有不正确的地方,希望指正,谢谢!
相关推荐
本文将详细讲解如何通过设置字符编码过滤器(`SetCharacterEncodingFilter`)来解决这一问题,同时深入理解字符编码的原理以及在实际应用中的配置方法。 字符编码是计算机处理文本的一种方式,它将字符与数字对应...
除了使用web.xml配置外,还可以使用Java配置方式,通过Spring Boot的FilterRegistrationBean或者ServletContainerInitializer来注册过滤器。 封装好的工具类可以让开发者更方便地复用这个过滤器。例如,可以创建一...
下面是一个简单的示例,展示如何在Spring Boot中创建一个乱码过滤器: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component public class ...
要解决这个乱码问题,我们可以按照以下步骤创建一个过滤器: 1. 创建Filter类:首先,我们需要创建一个实现了javax.servlet.Filter接口的类。在类中,我们需要重写doFilter()方法,这是过滤器的核心,它将在每次...
总结,SSH框架下的中文乱码问题主要通过自定义过滤器解决,设置合适的请求和响应的字符编码。同时,对于不同的数据提交方式,如表单和JS,需要采取相应的解决方案。在实际开发中,确保整个数据传输过程中的字符编码...
`FilterDome`是一个具体的Filter实现,通常用来解决字符编码问题,即乱码过滤器。在处理中文或其他多语言字符时,乱码问题时常出现,`FilterDome`就是为了解决这个问题而设计的。下面将详细介绍`FilterDome`的工作...
如果过滤器配置正确,那么中文参数应该能够正确显示,而不会出现乱码。 总的来说,通过在过滤器中设置合适的字符编码,我们可以有效地解决JSP应用中请求参数中文乱码的问题。需要注意的是,选择哪种字符编码取决于...
2. **通过YAML或properties配置**:在`application.yml`或`application.properties`中使用`spring.mvc.filter`和`server.servlet.filter`(过滤器)以及`spring.servlet.listener`(监听器)进行配置。 **源码与...
Java Servlet过滤器是Java Web应用程序中的重要组件,它在请求被Servlet处理之前和响应返回给客户端之后进行拦截,可以用于实现各种功能,如字符编码转换、URL重写、权限控制等。本篇将深入讲解Java Servlet过滤器的...
在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码,避免因为编码不一致导致的数据乱码问题。 1. **字符编码的重要性** 在网络通信中,字符编码扮演...
如果已经有一个处理编码的过滤器存在,我们需要确保拦截器和过滤器之间的工作不会冲突。 6. **测试与调试**:在实现和配置好拦截器后,进行充分的测试是必不可少的。可以尝试发送包含中文的请求,检查是否还有乱码...
对于解决中文乱码问题,我们需要在`web.xml`中配置一个字符编码过滤器。 ##### 2.1 配置CharacterEncodingFilter ```xml <filter-name>encodingFilter <filter-class>org.springframework.web.filter....
创建一个自定义过滤器,如`CharacterEncodingFilter`,并配置在Spring MVC的过滤链中,以强制设置请求和响应的编码。 6. **国际化与本地化**: 在处理多语言环境时,需要考虑不同的字符集。Spring MVC支持国际化和...
总结,解决Spring 3 MVC中GET提交方式乱码问题,主要涉及服务器端的字符编码过滤器配置、Controller方法的参数接收以及前端页面的编码设置。理解HTTP协议和字符编码原理,以及正确配置Spring MVC,将有助于避免此类...
在JAVAEE平台上,过滤器(Filter)是一种强大的工具,它允许开发者在请求到达Servlet之前或Servlet响应返回客户端之后对请求和响应进行处理。过滤器在Java Web应用中扮演着重要角色,可以实现如数据验证、登录检查、...
- 确保过滤器配置在其他过滤器之前加载,以保证其能正确处理字符编码。 - 如果使用了Struts框架,需要确保Struts的配置文件(如`struts-config.xml`)中也正确地设置了字符集,以避免不一致的问题。 #### 数据库端...
本文将总结解决SSH中文乱码问题的方法,主要涉及到spring的编码过滤器、struts.properties配置、MyEclipse工程属性设置等方面。 一、 Spring 的编码过滤器 Spring提供了一个CharacterEncodingFilter来解决中文乱码...
- 定义一个过滤器(Filter)来统一设置所有请求的字符编码。这种方式更为高效且易于管理。示例代码如下: ```java public class EncodingFilter implements Filter { @Override public void doFilter...
在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它允许我们在数据处理之前或之后执行特定的任务,比如字符编码转换、权限验证等。在这个主题中,我们将深入探讨"过滤器简单使用代码",包括字符编码、检查...
每个过滤器都是通过实现`javax.servlet.Filter`接口并覆盖`doFilter()`方法来工作的,然后在`web.xml`或Spring Boot的配置文件中进行注册和配置。理解过滤器的工作原理和使用方法是Java EE开发中的重要技能,它能...