转载

Spring MVC 中 HandlerInterceptorAdapter的使用

标签: spring mvc handlerinterceptoradapter | 发表时间:2015-07-17 03:39 | 作者:youyu4

分享到:
出处:http://www.iteye.com

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。

Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

[java] view plain copy

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)    
  2.         throws Exception {    
  3.         return true;    
  4.     }    
  5.     public void postHandle(    
  6.             HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)    
  7.             throws Exception {    
  8.     }    
  9.     public void afterCompletion(    
  10.             HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)    
  11.             throws Exception {    
  12.     }    

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

在preHandle中,可以进行编码、安全控制等处理; 

在postHandle中,有机会修改ModelAndView; 

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 

如果基于xml配置使用Spring MVC,

可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),

如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。

注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。 

一个demo: 

public class LogAuditInterceptor extends HandlerInterceptorAdapter{   private Log logger = LogFactory.getLog(this.getClass());    @Autowired  private LogAuditService logAuditService;    @Override  public void afterCompletion(HttpServletRequest request,     HttpServletResponse response, Object handler, Exception ex)    throws Exception {   logger.debug("LogAuditInterceptor.afterCompletion run...");   String excMsg = (String) request.getAttribute("exception_msg");   String userId = request.getParameter("userId");   LogAudit logAudit = new LogAudit();   if(StringUtils.isNotEmpty(userId)){    Pattern pattern = Pattern.compile("[0-9]*");    Matcher isNum = pattern.matcher(userId);    if(!isNum.matches()){     logAudit.setUserId((long)0);    }else{     logAudit.setUserId(Long.valueOf(userId));    }   }else{    logAudit.setUserId((long)0);   }   logAudit.setIp(RequestUtil.getRealIp(request));   logAudit.setAction(request.getRequestURI());   logAudit.setMethod(request.getMethod());   logAudit.setLogAdminFlag(LogAdminFlag.NO.toStringValue());   logAudit.setSuccessFlag(SuccessFlag.YES.toStringValue());   logAudit.setCreatedTime(new Date());   if(StringUtils.isNotEmpty(excMsg)){    logAudit.setSuccessFlag(SuccessFlag.NO.toStringValue());    logAudit.setErrorMessage(excMsg);   }   logAuditService.addLogAudit(logAudit);  } }
已有 0 人发表留言,猛击->> 这里 <<-参与讨论

ITeye推荐

  • —软件人才免语言低担保 赴美带薪读研!—
正文到此结束
Loading...