前言
在SpringMVC的架构图中,我们可以看到在访问处理器映射器后,springMVC会返回一堆执行链,里面包含了一堆的拦截器和handler,在这里,SpringMVC提供的拦截器类似于servlet中的Filter,用于对handler进行预处理和后处理。
正文
- 自定义拦截器
自定义一个拦截器,要实现HandlerInterceptor接口:
package com.xiaojian.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerInterceptor implements HandlerInterceptor {
/**
* controller执行前调用此方法,返回值表示是否放行,true表示放行.
* 可以在这个方法中加入登录校验和权限校验等
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("自定义拦截器在controller之前执行了...");
return true;
}
/**
* controller执行后,但是没有返回ModelAndView前调用这个方法,可以在这里对数据模型进行加工处理
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("自定义的拦截器在ModelAndView返回之前执行了...");
}
/**
* controller执行后,且视图也返回后调用此方法,可以在这里获得controller的异常信息,可以在这个
* 方法里面记录各类操作日志,或者清理资源等.
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("自定义的拦截器在视图返回后执行了....");
}
}
写好自定义的拦截器之后,还需要在springmvc.xml文件中配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xiaojian.springmvc.interceptor.MyHandlerInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
在这个配置中,mapping标签代表拦截的路径,我们这里配置了/**代表拦截所有请求。下面的bean标签对应自定义的拦截器即可,我们运行项目,就行测试:
可以看到,拦截器的各个方法都被执行了。需要注意的是,如果我们需要配置多个拦截器,执行顺序是按照配置的顺序来执行的。
也可以针对某种mapping配置拦截器:
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
- 静态资源访问
如果在DispatcherServlet中设置url-pattern为 /则必须对静态资源进行访问处理。
spring mvc 的<mvc:resources mapping="" location="">
实现对静态资源进行映射访问。
如对js文件访问配置:<mvc:resources location="/js/" mapping="/js/**"/>;
总结
SpringMVC系列的博文到此就告一段落了,在整个学习过程中,我们对每个部分进行了详细的说明,并且有小的案例来作为演示,随着项目经验的不断增加,肯定会了解到更加底层的东西,在后面的博文中我也会一一记录,作为查阅。