SpringMvc配置拦截器
2016-09-15 19:30
363 查看
Spring WebMvc框架中的Interceptor,与Servlet API中的Filter十分类似,用于对Web请求进行预处理/后处理。通常情况下这些预处理/后处理逻辑是通用的,可以被应用于所有或多个Web请求,例如:
实现拦截器的方法
方法1:实现 HandlerInterceptor接口 或者继承 HandlerInterceptorAdapter适配器,区别在于
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器;
返回值:true表示继续流程(如调用下一个拦截器或处理器);
false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
方法2:实现WebRequestInterceptor接口
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配置
其中
记录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 拦截器简单配置
- springMVC拦截器配置
- SpringMvc拦截器配置
- springmvc拦截器-定义和配置
- SpringMVC-intercepter(拦截器)配置
- springmvc 拦截器配置
- springmvc拦截器配置
- springMVC 拦截器简单配置
- 利用springMVC拦截器配置网站根目录
- springmvc的拦截器配置
- 【SpringMVC整合MyBatis】springmvc拦截器-定义和配置
- springMVC拦截器简单配置
- SpringMVC中Session超时拦截器配置
- springMVC拦截器、json转换器、统一异常处理在配置文件中配置
- springMvc拦截器配置
- springmvc里使用注解进行拦截器配置
- SpringMVC-拦截器的配置与使用
- springMVC 拦截器简单配置
- SpringMVC配置拦截器实现登录控制
- springMVC 拦截器简单配置