好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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" />

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

查看更多关于springmvc字符编码过滤器CharacterEncodingFilter的使用的详细内容...

  阅读:26次