本文作者:钟昕灵,叩丁狼高级讲师。原创文章,转载请注明出处。
前言
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。
SpringMVC中的Interceptor拦截器用于拦截Controller层接口,表现形式有点像Spring的AOP,但是AOP是针对单一的方法。Interceptor是针对Controller接口以及可以处理request和response对象。
下面,我们来看看SpringMVC中拦截器的使用及实现
在该接口中,定义了一下三个方法
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}
-
preHandle:
在访问到达Controller之前执行,如果需要对请求做预处理,可以选择在该方法中完成
返回值为true:继续执行后面的拦截器或者Controller
返回值为false:不再执行后面的拦截器和Controller,并调用返回true的拦截器的afterCompletion方法 -
postHandle:
在执行完Controller方法之后,渲染视图之前执行,如果需要对响应相关的数据进行处理,可以选择在该方法中完成 -
afterCompletion:
调用完Controller接口,渲染View页面后调用。返回true的拦截器都会调用该拦截器的afterCompletion方法,顺序相反。
自定义一个我们自己的拦截器非常简单,定义一个类,实现上面的接口,然后覆写对应的方法即可
当然,在实际开发中,我们一般选择继承该接口的实现类HandlerInterceptorAdapter来实现拦截器的定义,如下:
public class CheckLoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1:获取登录凭证
Employee emp = UserContext.getCurrentUser();
if(emp == null){
//没有登录
response.sendRedirect("/login.html");
return false; //终止请求继续往下执行
}
return true; //放行
}
}
上面,我们定义了一个检查用户是否登录的拦截器,如果没有登录,跳转到登录页面,反之,放行继续访问目标资源
要让我们的拦截器被框架得知并管理,我们还需要在配置文件中做如下配置来注册拦截器
<mvc:interceptors>
<mvc:interceptor>