Spring mvc 内置编码过滤器原理解析
在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 内置编码过滤器原理解析相关推荐
- python中f点flush是什么函数_Python文件操作及内置函数flush原理解析
1.打开文件得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 示例文件 '你好呀' 我是于超 嗯 再见 文件操作基本流程 f=open('chenli',encoding='ut ...
- Python培训分享:Python内置标准异常及其解析
本期小编为大家带来的Python培训教程是关于"Python内置标准异常及其解析"的内容,我们都知道,在Python技术运作下,总会出现一些Python无法正常处理的程序时就会发生 ...
- Spring Boot 内置Tomcat——集成PHP解决方案
Demo:https://gitee.com/shentuzhigang/mini-project/tree/master/springboot-embed-tomcat-php-demo 问题分析 ...
- spring security http.rememberMe()使用和原理解析
spring security http.rememberMe()使用和原理解析 文章目录 spring security http.rememberMe()使用和原理解析 转载请贴上本文链接 htt ...
- Spring Boot内置Tomcat设置超时时间
最近有个小工程扫描出一个安全漏洞, SlowHttp慢速攻击的,需要修改 Tomcat 的配置,也正好关于 Tomcat 的参数调优,正好记录一下. 漏洞信息 查了一下这个漏洞,漏洞有两个解决方法, ...
- 修改Spring boot内置的tomcat端口
介绍两种种简单的修改spring boot内置端口的方法: 第一种:在入口直接设置端口,代码如下所示: public static void main(String[] args){SpringApp ...
- Spring Boot 内置Tomcat——getServletContext().getRealPath()为临时目录问题解决方案
问题描述 getServletContext().getRealPath()为临时目录 问题分析 默认情况下Spring Boot中request.getServletContext().getRea ...
- Spring Boot——内置Tomcat配置阿里云免费SSL证书(PFX格式证书)[启用HTTPS协议]
基本概念 SSL证书:SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA ...
- 【若依(ruoyi)】shiro 内置的过滤器(filter)
前言 shiro: 1.5.3 若依(ruoyi): v4.3 (测试shiro的环境) shiro 内置的过滤器(filter) Filter Name Class anon org.apache. ...
最新文章
- 并发编程协程(Coroutine)之Gevent
- OpenCV中OrbDescriptorExtractor
- 计算道路超高lisp_5G+AI超高清智能视频监控将迎来增长期
- 高性能、高可靠分布式文件系统 go-fastdfs v1.2.0 发布
- 信息学奥赛一本通(1068:与指定数字相同的数的个数)
- 获取客户端的IP地址
- mysql——event定时任务
- iOS应用日志:开始编写日志组件与异常日志
- 并行 并发 多线程 区别
- 学会2种方法,小白也能快速产出标准的Axure原型
- 莫烦python看的顺序_莫烦Python笔记__Python多进程技巧
- python 加汉明窗_什么是汉明窗?加Hanmming窗的作用?
- 北京h5游戏制作平台有哪些,h5游戏公司实例评测
- CVPR2022-HairCLIP:基于文本和参考图像的头发编辑方法论文理解
- Java中 [I@4554617c 问题解决
- 一文解决Python所有报错
- 阿里云mysql创建数据库服务器地址_阿里云服务器创建数据库操作流程
- 刚刚!阿里香港上市,他们的区块链和百度、腾讯有什么不同?
- <四>关于flv格式解析
- java计算百分比值的方法