HandlerInterceptor拦截器

1.介绍
Web开发中,我们除了使用Filter来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。HandlerInterceptor的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行
2.代码示例
HandlerInterceptor接口源码示例
HandlerInterceptor拦截器
有三个方法
preHandle 请求处理之前进行调用(Controller方法调用之前)
postHandle 请求处理之后进行调用(Controller方法调用之后)
afterCompletion 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

    /**
@author luzhuhong
@version V1.0
@Title:
@Description: 登录拦截器, 如果被请求的方法上有@NeedLogin注解,那么就会做登录验证
@date 2016年1月27日 上午8:48:52
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String token = request.getHeader(Constants.TOKEN.HEADER_KEY_NAME);
    CurrentUser currentUser = CurrentUserFactory.getCurrentUser(token, Constants.TOKEN.JWT_SECURITY_KEY);
    Applications.setCurrentUser(currentUser);
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    NeedLogin loginAnno = handlerMethod.getMethodAnnotation(NeedLogin.class);
    // 当前请求不需要登录
    if (loginAnno == null) {
        return true;
    }
    // 如果当前用户已经登录
    if (currentUser.isLoggedIn()) {
        return this.checkAccess(loginAnno, currentUser);
    } else {
        throw new UserNotLoginException();
    }
}

protected boolean checkAccess(NeedLogin loginAnno, CurrentUser currentUser) {
    String[] roles = loginAnno.roles();
    if (roles == null || roles.length == 0) {
        return true;
    }
    List<String> userRoles = currentUser.getRoles();
    if (CollectionUtils.isEmpty(currentUser.getRoles())) {
        for (String role : roles) {
            if (userRoles.contains(role)) {
                return true;
            }
        }
    }
    return false;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                       ModelAndView modelAndView) throws Exception {
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    Applications.clearCurrentUser();
}}

相关文章: