通过原理解析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
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; } @Override protected 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。
只要过滤器中配置了forceEncoding 属性,则forceRequestEncoding和forceResponseEncoding 则保持一致,都使用forceEncoding的值。 doFilterInternal() 方法 该方法是过滤器的核心方法。 如果 如果 request.getCharacterEncoding() 解析 request中获取encoding,追踪
从代码中发现,contentType 就是从http请求头中获取 content-type属性。 判断 content-type 中是否包含charset属性。如果存在则解析charset的属性值,并返回。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |