一、拦截器
Spring web MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理和后处理。Filter可以拦截任何请求,但是拦截器只能拦截控制器。它与AOP的差别是aop主要在特定方法前后进行处理,而拦截器主要针对的是控制器方法。
常用于
- 日志记录 :记录请求信息的日志
- 权限检查,如登录检查
- 性能检测:检测方法的执行时间
二、实现自定义拦截器
新建类实现HandlerInterceptor
接口HandlerInterceptor有三个方法:
- preHandle 在控制器执行之前执行,最后只有返回true才能进入控制器方法。
- postHandle 在控制器执行完后才执行,但该方法执行条件为preHandle方法返回true的时候
- afterCompletion 整个请求中最后才执行的方法,也就是在DispatcherServlet 渲染了对应的视图之后执行。执行的前提条件为preHandle方法返回true
package hu.ordersystem.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class AdminLoginInterceptors implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//在请求进入控制器之前执行
String uri=request.getRequestURI();
System.out.println(uri);
if(uri.equals("/ordersystem/login")) {
return true;
}
if(uri.equals("/ordersystem/checkAdmin")) {
return true;
}else {
Object admin = request.getSession().getAttribute("admin");
if(admin!=null) {
return true;
}else {
response.sendRedirect("/ordersystem/index.jsp");
return false;
}
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
//在控制器执行完后执行
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
//在整个请求结束之后执行
}
}
配置拦截器
在xml配置文件配置拦截器,在这仅用一个拦截器做示范
<mvc:interceptors>
<!--全局拦截-->
<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>
<!--配置特定的拦截器来拦截特定的请求-->
<mvc:interceptor>
<!--拦截/ordersystem/login的请求-->
<mvc:mapping path="/ordersystem/login"/>
<!--不拦截/admin下的请求-->
<mvc:exclude-mapping path="/admin/**"/>
<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/ordersystem/checkAdmin"/>
<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器栈
当有多个拦截器生效时就生成了拦截器栈,此时拦截器执行的顺序为先进后出,它的执行顺序与xml配置文件中拦截器的配置顺序有关。
例如:
在xml里的 拦截器配置顺序为:先拦截器A,再拦截器B
程序中拦截器执行顺序:
preHandle(A)——>preHandle (B)——>控制器——>
postHandle (B)——>postHandle (A)——>JSP页面——>
afterCompletion (B)——>afterCompletion (A)