HandlerInterceptor拦截器

本文深入探讨了Spring框架中的HandlerInterceptor(拦截器)概念,详细解释了其如何在Web开发中提供比Filter更精细的控制能力,特别是在request处理的各个阶段。通过具体代码示例,展示了如何实现一个登录拦截器,该拦截器检查请求是否带有有效登录状态,以及如何根据注解(@NeedLogin)判断是否需要执行登录验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值