CharacterEncodingFilter
为了解决数据的中文乱码问题,需要引入Filter来设置编解码格式
在web.xml文件中进行如下配置:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!--调用set方法-->
<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>
<!--
如果使用bean标签或ref标签的话,作用范围是全局
全局:DispatcherServlet作用范围下的全局
-->
<ref bean="customHandlerInterceptor"/>
<!--<bean class="com.cskaoyan.interceptor.CustomHandlerInterceptor"/>-->
</mvc:interceptors>
② 局部
配置一个mapping,在path属性中指定路径
对特定的url起作用
<mvc:interceptor>
<!--
/hello → hello这个请求
/hello* → helloxxx请求
/hello/* → hello/xxx请求
/hello/** → hello以及hello的所有多级请求 /hello/aaa/bbb/ccc
-->
<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>
如果有某个preHandle方法的返回值为false则会中断流程,但如果在此prehandle方法之前执行的prehandle方法的返回值为ture,则会执行与这些prehandle方法相对应的afterComletion方法
例如:如果preHandle1返回值为false:
如果:preHandle2返回值为false:
如果:preHandle3返回值为false: