您的位置:首页 > 编程语言 > Java开发

Spring中web.xml过滤器详解:org.springframework.web.filter.CharacterEncodingFilter

2019-03-19 16:03 120 查看

        org.springframework.web.filter.CharacterEncodingFilter  是Spring为web开发提供的一个过滤器,主要目的是防止web开发中出现的乱码问题。是Spring在web请求中定义request和response的编码。

使用场景

         当客户端和服务端使用了不同的字符集进行编码,就会出现乱码的问题。这就需要服务端在收到客户端发来的数据,或返回给客户端的数据时,能够使用统一的字符集进行编码,以避免乱码的出现。

        对于一个表单来说,如果method=get的话,对于Spring提供的这个过滤器来说是不会起作用的。  因为get方法是将参数直接跟在了请求的url上 ,而post方法则是将请求的参数放在报文内部。

使用方式

具体是在wen.xml中进行设置,具体使用方法如下:

[code]<!-- Filter 定义  -->
<!-- Character Encoding filter -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中encoding用来设置编码格式,forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,设置为true则强制覆盖之前的编码格式
CharacterEncodingFilter类具有encoding和forceEncoding两个属性,其中encoding是表示设置request的编码,forceEncoding表示是否同时设置response的编码。
当request中已经被指定了一个字符集的时候是否再将用endcoding对应的字符集设置到request中去。默认为false,意思是当request中指定了编码方式,则不适用用encoding指定的编码方式。

查看CharacterEncodingFilter的源码

[code] @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);
}

//当指定了encoding,且forceEncoding为false ,同时request中没有制定编码方式事,设置request和response的编码方式为encoding所指定的编码方式

通过源码也能看见,encodin用于设置request的编码,而forceEncoding为ture时设置response的编码。

源码赏析

当Servlet容器启动的时候,会读取web.xml中对于过滤器的配置信息, 读取到<init-param>中的子标签<param-name>encoding和forceEncoding所对应的<param-value>的值,再通过调用该类setEncoding(String encoding)和setForceEncoding(boolean forceEncoding) 将值注入到这连个字段中。

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐