HandlerInterceptor的使用:

HandlerInterceptor的使用::
1、org.springframework.web.servlet.HandlerInterceptor位于spring-webmvc.jar中,是一个spring拦截器,默认实现类为:
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
2、可用于拦截用户的每个请求数据,主要作用如下:
用户登陆以及用户权限管理;
打印请求处理时间;
打印请求参数等;
根据用户的选择来决定是用HTML还是用Excel来作为View,来决定返回数据对象;
blackboard building block的应用:在每一个controller之前都要生成context,在render view之后都要release context
3、方法说明
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
该方法会在Controller的方法执行前会被调用,可以使用这个方法来中断或者继续执行链的处理(可多个反向调用的处理器链,通过DispathcherServlet来管理并调用每个拦截器的preHandle方法,其本身是最后一个处理器),当返回true时,处理执行链会继续,当返回false时,则不会去执行Controller的方法

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
在controller的方法执行之后,在DispatcherServlet类导向到view进行render之前依次执行。因为它有ModelAndView 传进来,那么我们就可以在render view之前往view中添加额外的model对象,或者对view的去处进行修改

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
在请求过程(request processing)完成后(在render view完成后)执行,作为最后一个拦截器执行,用于清理资源

上述三个方法都是异步方法,由DispatcherServlet在controller之前(调用controller前)执行所有拦截器链中的preHandle方法,可用于判断是由有权限访问或返回错误码,preHandle方法返回true时继续执行,否则,终止;postHandle在调用controller后转向视图前执行
4、实例应用
登录验证:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
Admin user = (Admin) request.getSession().getAttribute("admin");
//此处,还可通过httpServletRequest.getParameterNames();方法来打印该请求的所有请求参数信息
String requestURI = request.getRequestURI();
String loginUrl = "/login.jhtml";
String uri = requestURI.substring(requestURI.lastIndexOf("/"));
if (user == null) {
if (uri.startsWith("/login") || uri.startsWith("/imageLogin") || uri.startsWith("/checkLogin")) {
return true;
} else {
// 非法请求 重定向到登录页面
response.sendRedirect(request.getContextPath() + loginUrl);
return false;
}
} else {
// 添加日志
String ip = request.getRemoteAddr();
Log log = new Log();
log.setIp(ip);
ThreadLocalUtils.set(log);
return true;
}
}
打印请求处理时间:
在preHandle方法记录请求处理前的时间并绑定到线程变量ThreadLocal类(只有当前请求线程可见)中,在执行完成后执行afterCompletion方法时,再从本地线程中获取请求相应的时间并执行打印

猜你喜欢

转载自pinghuqiuyue.iteye.com/blog/2379109
今日推荐