CharacterEncodingFilter
为了解决数据的中文乱码问题,需要引入Filter来设置编解码格式
在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>
HandlerInterceptor
它的功能类似于Filter,是
通过handlerMapping生成了handlerExecutionChain(执行链,也就是执行计划),包含了handler
和List<HandlerInterceptor>
简单来说,就是按照计划(顺序)执行handler和handlerInterceptor的中方法。
1️⃣ HandlerInterceptor的使用
第一步
编写一个类继承HandlerInterceptor接口,可选择性地重写接口中的三个方法preHandle、postHandle、afterCompletion
三个方法与handler方法的执行顺序如下:
① preHandle(预处理)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
返回一个boolean的值
- 为true则表示可以继续后续的方法
- 为false则表示不能继续后续的方法
② postHandle(后处理)
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
方法的参数modelAndView是handler方法执行完响应的modelAndView
如果响应的是json数据,那么modelAndView的值为null
这个方法可以对modelAndView做一些额外的处理
③ afterCompletion
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
只要当前的HandlerInterceptor的preHandler方法的返回值为true,就一定可以执行该HandlerInterceptor的afterCompletion方法
第二步
在application.xml中进行配置,注册为interceptor(),并可以在此指定他的范围
① 全局
DispatcherServlet作用范围下的全部Handler
可以使用id或者使用全类名来配置
<mvc:interceptors>
<ref bean="customHandlerInterceptor"/>
</mvc:interceptors>
② 局部
配置一个mapping,在path属性中指定路径
对特定的url起作用
<mvc:interceptor>
<mvc:mapping path="/hello/**"/>
<ref bean="customHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
也可以在配置类中进行配置:
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
registration.addPathPatterns("/**");
}
}
2️⃣ 多个interceptor的执行顺序
类似于栈,先进后出,即先执行preHandle方法的,后执行postHandle方法和afterCompletion方法
执行顺序体现在配置文件中:
<mvc:interceptors>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
<ref bean="handlerInterceptor3"/>
</mvc:interceptors>
例如:如果preHandle1返回值为false: