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