springmvc配置过滤器时,访问html页面出现乱码问题

在学习springmvc的时候,在jsp页面使用post的方式提交表单,然后就出现乱码了,于是使用springmvc提供的过滤器进行过滤,过滤器代码如下:

 2     <filter>
 3         <filter-name>characterEncodingFilter</filter-name>
 4         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class
 6         <init-param>
 7             <param-name>encoding</param-name>
 8             <param-value>utf-8</param-value>
 9         </init-param>
18         <init-param>
19             <param-name>forceRequestEncoding</param-name>
20             <param-value>true</param-value>
21         </init-param>
24         <init-param>
25             <param-name>forceResponseEncoding</param-name>
26             <param-value>true</param-value>
27         </init-param>
28     </filter>
29     <filter-mapping>
30         <filter-name>characterEncodingFilter</filter-name>
31         <!--
32         /*:表示强制所有的请求先通过过滤器处理
33         参考视频地址:https://www.bilibili.com/video/BV1sk4y167pD?p=17
34         -->
35         <url-pattern>/*</url-pattern>
36     </filter-mapping>

值得注意的是,我的html页面也是指定了utf-8的编码的。html页面的代码如下:

 1 !DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="utf-8">
 5     <title>这是一个静态页面</title>
 6 </head>
 7 <body>
 8     这是一个静态页面
 9 </body>
10 </html>

但是启动服务器访问就是乱码,我单独将这个文件使用浏览器打开,页面是没有乱码的。这说明应该是我服务器配置的问题。

通过查阅资料,将过滤器的forceResponseEncoding去掉即可,也就是不强制响应头使用utf-8的编码。具体的原因还是有点懵逼,但是我看了很多人的代码

他们配置过滤器的时候,是不会配置forceResponseEncoding、forceRequestEncoding的,也就是使用最多的是一下的过滤器代码:

2     <filter>
 3         <filter-name>characterEncodingFilter</filter-name>
 4         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class
 6         <init-param>
 7             <param-name>encoding</param-name>
 8             <param-value>utf-8</param-value>
 9         </init-param>
28     </filter>
29     <filter-mapping>
30         <filter-name>characterEncodingFilter</filter-name>
31         <!--
32         /*:表示强制所有的请求先通过过滤器处理
33         参考视频地址:https://www.bilibili.com/video/BV1sk4y167pD?p=17
34         -->
35         <url-pattern>/*</url-pattern>
36     </filter-mapping>

  至于为什么强制了响应头response的编码方式,访问html页面会造成乱码,这具体的原因还是不知道。以后使用springmvc配置的时候,如果配置过滤器就要留点心了。我在网上也找到了和我一样问题的人,参考博客地址:

https://blog.csdn.net/Knightletter/article/details/108394048?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

这是我使用第一种处理静态资源的方法处理出现的问题,也就是由springmvc转发给tomcat默认的servlet处理静态资源的方式。

第二种方式的,是使用springmvc自带的ResourceHttpRequestHandler这个处理器对象进行处理,也就是在springmvc的配置文件中加入以下配置:

 <mvc:resources mapping="/static/**" location="/static/"/>

这里我将所有的静态资源都放在了一个名为static文件夹下,如下图所示:

  这样就可以避免配置多个<mvc:resources了。并且第二种方式就算过滤器的response强制了编码,访问静态页面的时候还是不会乱码的。并且第二种方法更加符合实际开发的使用。所以处理springmvc处理静态资源文件的话,都是建议使用第二种方式。

参考视频地址:https://www.bilibili.com/video/BV1sk4y167pD?p=38

原文地址:https://www.cnblogs.com/ljfsmile0613/p/13881522.html