Spring MVC的拦截器(Interceptor) 与Java Servlet的过滤器(Filter) 类似,它
主要用于拦截用户的请求并做相应的处理。通常应用在权限验证、记录请求信息的日
志、判断用户是否登录等功能上。
拦截器与过滤器区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,拦截器里可以注入一个service,可以调用业务逻辑。
拦截器配置
<!-- 拦截器 --> <mvc:interceptors> <!-- 多个拦截器顺序执行 第一个 --> <mvc:interceptor> <!-- /**表示所有url包括url路径 /* --> <!-- 你要拦截的请求 配置拦截器作用的路径 --> <mvc:mapping path="/**"/> <!-- 不拦截的请求 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 --> <mvc:exclude-mapping path="/api/stu/findAll"/> <bean id="interceptor1" class="com.HandlerInterceptor.HandlerInterceptor1"></bean> </mvc:interceptor> <!-- 第二个 --> <mvc:interceptor> <!-- 你要拦截的请求--> <mvc:mapping path="/api/stu/find"/> <!-- 不拦截的请求 --> <bean id="interceptor2" class="com.HandlerInterceptor.HandlerInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors>
package com.HandlerInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HandlerInterceptor1 implements HandlerInterceptor {
//进入Handler方法之前执行
//用于身份认证、身份授权
//比如身份认证,如果认证通过表示当前用户没有登录,此方法拦截不再向下执行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("1执行业务逻辑之前,被执行");
// return false 表示拦截,不向下执行
// return true 表示放行
return true;
}
//进入Handler方法之后返回modelandview之前执行
//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
@Override
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("1执行业务逻辑之后,解析渲染视图之前,被执行");
}
//执行Handler完成此方法
//应用场景:统一异常处理,统一日志处理
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("1执行业务逻辑之后,视图渲染之后,被执行");
}
}