您的位置:首页 > 编程语言 > Java开发

SpringMvc配置拦截器

2016-09-15 19:30 363 查看
Spring WebMvc框架中的Interceptor,与Servlet API中的Filter十分类似,用于对Web请求进行预处理/后处理。通常情况下这些预处理/后处理逻辑是通用的,可以被应用于所有或多个Web请求,例如:

记录Web请求相关日志,可以用于做一些信息监控、统计、分析
检查Web请求访问权限,例如发现用户没有登录后,重定向到登录页面
打开/关闭数据库连接——预处理时打开,后处理关闭,可以避免在所有业务方法中都编写类似代码,也不会忘记关闭数据库连接


实现拦截器的方法

方法1:实现 HandlerInterceptor接口 或者继承 HandlerInterceptorAdapter适配器,区别在于

public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
HttpSession httpSession = httpServletRequest.getSession();
User user = (User)httpSession.getAttribute("user");
if(null == user){
httpServletResponse.sendRedirect("/index");
return false;
} else {
return true;
}
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}


preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器;

返回值:true表示继续流程(如调用下一个拦截器或处理器);

false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

方法2:实现WebRequestInterceptor接口

public class TestInterceptor implements WebRequestInterceptor{

@Override
public void preHandle(WebRequest webRequest) throws Exception {
System.out.println("preHandle");
}

@Override
public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {
System.out.println("postHandle");
}

@Override
public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {
System.out.println("afterCompletion");
}
}


preHandle(WebRequest webRequest) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,然后利用WebRequest 的setAttribute(name, value, scope) 把它放到WebRequest 的属性中。这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer 类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:

SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。

SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。

SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。

applicationContext.xml配置

<!-- 拦截器 -->
<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<mvc:interceptor>
<mvc:mapping path="/*/*"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.home.common.Interceptor.LoginInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.home.common.Interceptor.TestInterceptor"/>
</mvc:interceptor>
</mvc:inte
4000
rceptors>


其中
<mvc:mapping path="/*/*"/>
<mvc:mapping path="/*"/>
是不同的,
<mvc:mapping path="/*"/>
代表的是根目录下的第一级的请求,不是指所有的请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SpringMvc 拦截器