服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springmvc字符编码过滤器CharacterEncodingFilter的使用

springmvc字符编码过滤器CharacterEncodingFilter的使用

2021-11-16 13:21lianjunzongsiling Java教程

这篇文章主要介绍了springmvc字符编码过滤器CharacterEncodingFilter的使用,具有很好的参考价值,希望对大家有所帮助。

字符编码过滤器CharacterEncodingFilter

一、在web.xml中的配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- characterEncodingFilter字符编码过滤器 -->
<filter>
 <filter-name>characterEncodingFilter</filter-name>
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 <init-param>
  <!--要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)-->
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
 </init-param>
 <init-param>
  <!--是否强制设置request的编码为encoding,默认false,不建议更改-->
  <param-name>forceRequestEncoding</param-name>
  <param-value>false</param-value>
 </init-param>
 <init-param>
  <!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
  <param-name>forceResponseEncoding</param-name>
  <param-value>true</param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>characterEncodingFilter</filter-name>
 <!--这里不能留空或者直接写 ' / ' ,否者不起作用-->
 <url-pattern>/*</url-pattern>
</filter-mapping>

二、CharacterEncodingFilter过滤器类浅析

打开该类源码,可以看到该类有三个类属性

?
1
2
3
private String encoding; //要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)
private boolean forceRequestEncoding = false; //是否强制设置request的编码为encoding
private boolean forceResponseEncoding = false; //是否强制设置response的编码为encoding

主要方法只有一个,也就是下面这个,代码逻辑很简单,如注释所解释

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String encoding = getEncoding();
    if (encoding != null) { //如果设置了encoding的值,则根据情况设置request和response的编码
     //若设置request强制编码或request本身就没有设置编码
     //则设置编码为encoding表示的值
        if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
            request.setCharacterEncoding(encoding);
        }
     //若设置response强制编码,则设置编码为encoding表示的值
        if (isForceResponseEncoding()) { //请注意这行代码,下面有额外提醒
            response.setCharacterEncoding(encoding);
        }
    }
    filterChain.doFilter(request, response);
}
?
1
2
3
4
# 额外提醒
if (isForceResponseEncoding()) {
 response.setCharacterEncoding(encoding);
}

是在

?
1
filterChain.doFilter(request, response);

之前执行的,这也就是说这段代码的作用是设置response的默认编码方式,在之后的代码里是可以根据需求设置为其他编码的,即这里设置的编码可能不是最终的编码,网上很多文档说这里设置的是最终的编码方式,这是错的。

SpringMVC配置字符编码过滤器CharacterEncodingFilter来解决表单乱码问题

1、GET请求

针对GET请求,可以配置服务器Tomcat的conf\server.xml文件,在其第一个<Connector>标签中,添加URIEncoding="UTF-8"即可,如下所示:

?
1
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

springmvc字符编码过滤器CharacterEncodingFilter的使用

2、POST请求

但是,针对POST请求,仅配置Tomcat的server.xml文件中的<Connector标签不足以解决乱码问题,因此,需要利用Spring的字符编码过滤器

?
1
org.springframework.web.filter.CharacterEncodingFilter

步骤:配置所开发项目的web.xml文件,添加以下内容至文件开头处即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- ================start 配置spring的字符编码过滤器================ -->   
    <filter>
        <!-- 解决post乱码问题需要配置spring编码过滤器 -->
        <filter-name>characterEncoding</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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
<!-- ================end 配置spring的字符编码过滤器================ -->

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/lianjunzongsiling/article/details/77926370

延伸 · 阅读

精彩推荐