博客分类: servletspringtomat字符编码

    今天在写程序时,前台利用GET方式向后端发出一个请求,里面含有中文数据,结果在后端显示的是乱码,此时就比较奇怪,spring里面也配了字符过滤器,却出现了乱码,所以就看了一下spring实现的该过滤器,下面是过滤器的实现代码

org.springframework.web.filter.CharacterEncodingFilter.java

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该过滤器是这样配置的

Xml代码 收藏代码

characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding
UTF-8

forceEncoding
true

看了代码,才知道spring只是利用request.setCharacterEncoding(this.encoding);帮助我们处理了POST方式的乱码问题,碰到GET方式的提交,还是会出现乱码。

注意:自从Tomcat5.x开始,就对GET方式和POST方式的提交分别给予不同的处理方式。POST方式是利用request.setCharacterEncoding()来进行设置编码,如果没有设置的话,就是按照默认的ISO-8859-1来进行编码;GET方式提交总是利用默认的ISO-8859-1来进行编码参数。

所以碰到GET方式的提交就要利用一下的两种方式来解决中文乱码问题:

1.利用String

Java代码 收藏代码
String username = new String(username.getBytes(“ISO-8859-1”), “UTF-8”); //通过默认的编码获取到byte[],然后进行UTF-8再次编码

2.在tomcat中的server.xml进行配置URIEncoding=“UTF-8”

Xml代码 收藏代码

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”)是不行的,最简单的方式如下例:

Java代码 收藏代码
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(有可能影响其他应用,所以不推荐)。

上面如有不正确的地方,希望指正,谢谢!

spring配置字符过滤器之后出现乱码的原因分析相关推荐

  1. Linux下sqlite3乱码,sqlite中文乱码问题原因分析及解决

    在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常.例如调用sqlite3_open打开数据库 ...

  2. web程序网页出现乱码的原因分析

    从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估计以后还会一样继续. 这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从wind ...

  3. 源码解析Spring Boot2默认数据库连接池HikariCP(高性能原因分析)

    现在市面上的数据库连接池非常多,其中HikariCP被Sping Boot2选中为默认的数据库连接池,且体积仅有152kb 为何选择HikariCP? 高性能,可以PK掉其它所有连接池,这个原因就足够 ...

  4. Code:Blocks 中文乱码问题原因分析和解决方法!

    这里以Code::Blocks 10.5版本为蓝本进行说明. 首先,请在Code::Blocks里面输入标准的一个C程序: #include<stdio.h> #include<st ...

  5. 关于get请求中文乱码的原因分析

    浏览器是怎么知道该按照哪种方式编码的? 浏览器向服务器请求数据的时候,服务器通过响应头中的content-type来告诉浏览器,发送的内容的编码格式.比如,我们在html页面里面加上如下的模拟响应头: ...

  6. tomcat 下jsp乱码的原因分析

    tomcat 下jsp乱码 我们先看一个例子(包含2个文件一个test.jsp , 和result.jsp): test.jsp <%@ page language="java&quo ...

  7. 【Spring】注解(AOP)不生效原因分析以及解决方案

    一 问题 我们在使用spring的注解时,稍不注意就很有可能会遇到注解没有生效的情况,比如下面这段代码,在发生类内调用时就出现了问题, import org.springframework.stere ...

  8. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  9. JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截

    JavaWeb 入门篇(6.1) 过滤器 实现字符过滤器 实现模拟权限拦截 Filter(过滤器) 概述 过滤器是一个对象,它对对资源(Servlet或静态内容)的请求或对资源的响应或两者都执行过滤任 ...

最新文章

  1. 软件工程概论——课堂测试1
  2. 以编程方式进行NLog的配置【转】
  3. Flutter - International 国际化,Localization 本地化, 使用Intl
  4. 《腾讯方法》阅后感:让你10分钟读完一本好书
  5. Servlet - Upload、Download、Async、动态注册
  6. 【Tensorflow】卷积神经网络实现艺术风格化通过Vgg16实现
  7. myisam和innodb到底谁更快
  8. IE8,9下的ajax缓存问题
  9. hihocoder 1457 : 后缀自动机四·重复旋律7(后缀自动机+拓扑序BFS)
  10. Vue中无法更改element ui组件样式问题
  11. You have tried to change the API from what has been previously approved
  12. java 反解析cron_Java解析Cron表达式
  13. en55032最新标准下载_欧盟多媒体设备CE认证将使用新标准EN55032
  14. 基于双碳背景和趋势讲述AcrelEMS企业微电网能效管理系统-Susie 周
  15. 51cto python数据分析系列课程 55g_Python 3 数据分析与挖掘系列课程完整版
  16. python中def main是什么意思_Python中’__main__’模块的作用
  17. 嵌入式开发学习路线图
  18. 【中土世界】宏大地名汇总
  19. LeetCode(力扣)初级算法 字符串篇
  20. systemctl mask和systemctl disable有什么区别?

热门文章

  1. 【面经】找实习两个月(面试题以及答案)
  2. win10默认安装路径修改_解放C盘!2种方法教你修改默认安装目录!
  3. unity3D中导入的物体锚点居中
  4. 发布汇编集成编译器Win-Masm v2.2
  5. css美化浏览器滚动条
  6. ubifs性能优化分析
  7. win7桌面的计算机在哪里设置密码,win7如何添加屏幕保护密码|win7设置屏幕保护密码的方法...
  8. HarmonyOS+Django登录页面
  9. ef mysql 事务_EF中使用事务 - 李超明的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 从施耐德的M262 谈PLC 处理器的演进