博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring字符集过滤器CharacterEncodingFilter
阅读量:6288 次
发布时间:2019-06-22

本文共 3846 字,大约阅读时间需要 12 分钟。

hot3.png

中的字符集过滤器可以很方便的为我们解决项目中出现的中文乱码问题,而且使用方法也很简单,只需要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encodingforceEncoding)即可:

springUtf8Encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
springUtf8Encoding
/*

以下是Spring字符集过滤器的源码:

public class CharacterEncodingFilterextends OncePerRequestFilter {         private String encoding;         private boolean forceEncoding = false;            /**      * Set the encoding to usefor requests. This encoding will be passed into a      * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call.      * 

Whether this encoding will overrideexisting request encodings * (and whether it will beapplied as default response encoding as well) * depends on the {@link #setForceEncoding "forceEncoding"} flag. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Set whether theconfigured {@link #setEncoding encoding} of this filter * is supposed to overrideexisting request and response encodings. *

Default is "false", i.e. do notmodify 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. *

Note that the response encoding will onlybe set on Servlet 2.4+ * containers, sinceServlet 2.3 did not provide a facility for setting * a default responseencoding. */ 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); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }

由源码可以知道,该字符集过滤器有两个重要参数,分别是encodingforceEncoding,这两个参数分别有什么作用呢?以下是参考文档的介绍:

setEncodingpublic voidsetEncoding(Java.lang.String encoding)Set the encodingto use for requests. This encoding will be passed into aServletRequest.setCharacterEncoding(java.lang.String) call. setForceEncodingpublic voidsetForceEncoding(boolean forceEncoding)Set whether theconfigured encoding of this filter is supposed to override existing request andresponse encodings.

 

通过参考文档,我们可以知道:

1.第一个方法setEncoding()相当于:ServletRequest.setCharacterEncoding(java.lang.String)

2.第二个方法setForceEncoding()的作用是:强制ServletResponse的编码格式和ServletRequest的编码格式一样。

也就是说,无论是request还是responseencoding设置了两者的编码格式,只不过forceEncoding默认值为false,此时就只是设置了request的编码格式,即在Servlet中:

request.setCharacterEncoding("XXXX"); 

       如果设置forceEncoding的值为true时,相当于Servlet中:

       request.setCharacterEncoding("XXXX");

       response.setCharacterEncoding(“XXXX”);  

现在我们回过头来看看最初给大家看的web.xml中那部分过滤器的配置,相信大家都明白了,配置的作用相当于Servlet中的:

@RequestMapping(value="XXXXX")  public void XXXXX(User user,HttpServletRequestreq,HttpServletResponse resp) throws UnsupportedEncodingException  {         resp.setCharacterEncoding("UTF-8");         req.setCharacterEncoding("UTF-8");  ......  }

因此,在请求处理的过程中我们可以不用考虑编码方面的问题,上面两句代码可以省略,编码统一交给Spring过滤器去处理,我们可以专心处理我们的业务逻辑代码,这就是Spring字符集过滤器的方便之处。

转载于:https://my.oschina.net/u/2277088/blog/795354

你可能感兴趣的文章
CSS基础知识(上)
查看>>
PHP中常见的面试题2(附答案)
查看>>
26.Azure备份服务器(下)
查看>>
mybatis学习
查看>>
LCD的接口类型详解
查看>>
Spring Boot Unregistering JMX-exposed beans on shutdown
查看>>
poi 导入导出的api说明(大全)
查看>>
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>