在Spring mvc框架中是如何解决从页面传来的字符串的编码问题的呢?

下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter。

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>
<filter-mapping>  <filter-name>characterEncodingFilter</filter-name>  <url-pattern>/*</url-pattern>
</filter-mapping> 

spring mvc 内部提供了CharacterEncodingFilter过滤器,该过滤器有两个参数encoding和forceEncoding。
1. encoding
设置请求响应的字符编码。(请求的数据使用encoding编码解析,使用encoding编码进行响应的数据)
2. forceEncoding
forceEncoding=true 强制所有的请求响应都使用encoding编码。
forceEncoding=false 如果请求头中包含charset,则使用chartset编码,否则使用encoding编码。

CharacterEncodingFilter 源码分析

public class CharacterEncodingFilter extends OncePerRequestFilter {private String encoding;private boolean forceRequestEncoding = false;private boolean forceResponseEncoding = false;public void setEncoding(String encoding) {this.encoding = encoding;}public void setForceEncoding(boolean forceEncoding) {this.forceRequestEncoding = forceEncoding;this.forceResponseEncoding = forceEncoding;}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String encoding = getEncoding();if (encoding != null) {if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}if (isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);}......
}

CharacterEncodingFilter 中包含 三个属性 encoding、forceRequestEncoding、forceResponseEncoding。
* encoding:字符编码类型
* forceRequestEncoding:request 是否强制使用encoding编码
* forceResponseEncoding:response 是否强制使用encoding编码

只要过滤器中配置了forceEncoding 属性,则forceRequestEncoding和forceResponseEncoding 则保持一致,都使用forceEncoding的值。

doFilterInternal() 方法

该方法是过滤器的核心方法。

如果forceRequestEncoding=true,和forceResponseEncoding=true,则request和response都是用配置的encoding。
如果forceRequestEncoding=false, 则判断request.getCharacterEncoding()是否有值,如果有值则使用客户端传过来的编码(例如:charset=utf-8)

request.getCharacterEncoding() 解析

request中获取encoding,追踪org.apache.coyoteRequest.java类中getCharacterEncoding() 方法。

getContentType() 方法


从代码中发现,contentType 就是从http请求头中获取 content-type属性。


判断 content-type 中是否包含charset属性。如果存在则解析charset的属性值,并返回。


想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Spring mvc 内置编码过滤器原理解析相关推荐

  1. python中f点flush是什么函数_Python文件操作及内置函数flush原理解析

    1.打开文件得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 示例文件 '你好呀' 我是于超 嗯 再见 文件操作基本流程 f=open('chenli',encoding='ut ...

  2. Python培训分享:Python内置标准异常及其解析

    本期小编为大家带来的Python培训教程是关于"Python内置标准异常及其解析"的内容,我们都知道,在Python技术运作下,总会出现一些Python无法正常处理的程序时就会发生 ...

  3. Spring Boot 内置Tomcat——集成PHP解决方案

    Demo:https://gitee.com/shentuzhigang/mini-project/tree/master/springboot-embed-tomcat-php-demo 问题分析 ...

  4. spring security http.rememberMe()使用和原理解析

    spring security http.rememberMe()使用和原理解析 文章目录 spring security http.rememberMe()使用和原理解析 转载请贴上本文链接 htt ...

  5. Spring Boot内置Tomcat设置超时时间

    最近有个小工程扫描出一个安全漏洞, SlowHttp慢速攻击的,需要修改 Tomcat 的配置,也正好关于 Tomcat 的参数调优,正好记录一下. 漏洞信息 查了一下这个漏洞,漏洞有两个解决方法, ...

  6. 修改Spring boot内置的tomcat端口

    介绍两种种简单的修改spring boot内置端口的方法: 第一种:在入口直接设置端口,代码如下所示: public static void main(String[] args){SpringApp ...

  7. Spring Boot 内置Tomcat——getServletContext().getRealPath()为临时目录问题解决方案

    问题描述 getServletContext().getRealPath()为临时目录 问题分析 默认情况下Spring Boot中request.getServletContext().getRea ...

  8. Spring Boot——内置Tomcat配置阿里云免费SSL证书(PFX格式证书)[启用HTTPS协议]

    基本概念 SSL证书:SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA ...

  9. 【若依(ruoyi)】shiro 内置的过滤器(filter)

    前言 shiro: 1.5.3 若依(ruoyi): v4.3 (测试shiro的环境) shiro 内置的过滤器(filter) Filter Name Class anon org.apache. ...

最新文章

  1. 并发编程协程(Coroutine)之Gevent
  2. OpenCV中OrbDescriptorExtractor
  3. 计算道路超高lisp_5G+AI超高清智能视频监控将迎来增长期
  4. 高性能、高可靠分布式文件系统 go-fastdfs v1.2.0 发布
  5. 信息学奥赛一本通(1068:与指定数字相同的数的个数)
  6. 获取客户端的IP地址
  7. mysql——event定时任务
  8. iOS应用日志:开始编写日志组件与异常日志
  9. 并行 并发 多线程 区别
  10. 学会2种方法,小白也能快速产出标准的Axure原型
  11. 莫烦python看的顺序_莫烦Python笔记__Python多进程技巧
  12. python 加汉明窗_什么是汉明窗?加Hanmming窗的作用?
  13. 北京h5游戏制作平台有哪些,h5游戏公司实例评测
  14. CVPR2022-HairCLIP:基于文本和参考图像的头发编辑方法论文理解
  15. Java中 [I@4554617c 问题解决
  16. 一文解决Python所有报错
  17. 阿里云mysql创建数据库服务器地址_阿里云服务器创建数据库操作流程
  18. 刚刚!阿里香港上市,他们的区块链和百度、腾讯有什么不同?
  19. <四>关于flv格式解析
  20. java计算百分比值的方法

热门文章

  1. JS 如何截取部分日期呢
  2. CVPR 2022 | 华为诺亚北大提出量子启发MLP,性能超越Swin Transfomer
  3. NLP领域最近比较火的Prompt,能否借鉴到多模态领域?一文跟进最新进展
  4. 如何用最简单的方式理解傅立叶变换?
  5. 微服务架构与Spring Cloud Alibaba
  6. 【学习笔记】《数据挖掘:理论与算法》CH4神经网络
  7. SSM实现个人博客-day01
  8. 使用Objects判断对象是否为空,并返回对应信息
  9. 多数据源:spring boot+mybatisplus配置
  10. 牛客题霸 SQL2 查找入职员工时间排名倒数第三的员工所有信息