HandlerInterceptor拦截器
1.介绍
Web开发中,我们除了使用Filter来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。HandlerInterceptor的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行
2.代码示例
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();
}}