1、定义
(1)动态拦截Action调用的对象,在Action执行前后执行一段代码或者在Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。
(2)在AOP中,拦截器用于在某个方法或者字段被访问之前,在拦截前后加入某些操作。
(3)java的拦截器主要是用在插件上、扩展件上,如PageHelper插件,拦截器可多次调用。
2、Spring拦截器
Spring对java的拦截器概念进行了包装,HandlerInterceptorAdapter继承了抽象接口HandlerInterceptor。
我们使用Spring拦截器,直接继承HandlerInterceptorAdapter.java这个抽象类。
/**
* 自定义拦截器
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
// 在业务处理器处理请求之前被调用
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
return super.preHandle(request, response, handler);
}
// 在业务处理器处理请求完成之后,生成视图之前执行
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
// 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
}
//用于处理异步请求
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
super.afterConcurrentHandlingStarted(request, response, handler);
}
}
<!-- spring的xml中配置 -->
<mvc:interceptors>
<mvc:interceptor><!--配置局部拦截器,需要满足下列路径条件-->
<mvc:exclude-mapping path="/user/logout"/><!--注销-->
<mvc:exclude-mapping path="/home/"/><!--在home中定义了无须登陆的方法请求,直接过滤拦截-->
<mvc:mapping path="/**"/>
<bean class="com.xinx.own.LoginInterceptor"/><!--自定义拦截器注册-->
</mvc:interceptor>
<!-- 可以直接注册自定义拦截器Bean来配置全局拦截器,会对所有请求拦截-->
</mvc:interceptors>
3、代码示例
/**
* 请求中appid参数若不存在数据库中,则对该请求进行拦截。
* @author grave-76
* @version 2019年8月12日 下午4:05:16
*
*/
public class AppidInterceptor extends HandlerInterceptorAdapter {
@Resource
private KingService kingService;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.print("开始进行拦截......");
String appid = request.getParameter("appid");
StringBuffer urlName = request.getRequestURL();
if(appid == null) {
System.out.print("请求中无appid参数,拦截掉:"+urlName);
return false;
}
Integer k = kingService.getKingIdByAppid(Integer.parseInt(appid));
if(k == null) {
System.out.print("数据库中无appid参数,拦截掉:"+urlName);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.print("拦截处理完成");
}
}