1.1. 关于乱码
在处理中文或非ASCII字符(需要使用输入法才可以输入的)时,如果存、取时,使用的字符编码不统一,就会出现乱码!
所以,出现乱码原因就是因为字符编码不统一,而解决问题的方案就是使用统一的编码!
需要统一编码的位置有:项目源码、数据库、处理数据的服务端组件、数据传输过程、#显示界面
1.2. 解决控制器中接收请求参数的乱码
通常,在Java EE项目中,解决问题的方式是:
request.setCharacterEncoding("utf-8");
由于Controller是运行在DispatcherServlet之后的,在Controller内部再执行更改编码格式已经晚了,事实上SpringMVC框架在DispatcherServlet之前就存在CharacterEncodingFilter可以确定请求与响应的编码格式,所以,在SpringMVC中,无法通过Controller或Interceptor来解决请求和响应的乱码问题。
在SpringMVC框架的CharacterEncodingFilter中,把使用的字符编码设计为变量,可以在web.xml中添加配置加以应用,来统一设置编码:
<!-- 配置字符编码过滤器 -->
<filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.3. 拦截器与过滤器有什么区别
拦截器是Interceptor,过滤器是Filter;
拦截器是SpringMVC中的组件,过滤器是Java EE中的组件;
拦截器是配置在Spring的配置文件中的,过滤器是配置在web.xml中的;
拦截器是运行在DispatcherServlet之后、Controller之前的,且在Controller执行完后还会调用2个方法,而过滤器是运行在所有的Servlet之前的;
拦截器的配置非常灵活,可以配置多项黑名单,也可以配置多项白名单,过滤器的配置非常单一,只能配置1项过滤路径;
拦截器与过滤器也有很多相似之处,例如:都可拒绝掉某些访问,也可以选择放行;都可以形成链。
相比之下,在一个使用SpringMVC框架的项目中,拦截器会比过滤器要好用一些,但是,由于执行时间节点的原因,它并不能完全取代过滤器!