SpringBoot中Inteceptor 之 请求处理器拦截器HandlerInterceptor

本文详细介绍了如何在Spring MVC项目中使用HandlerInterceptor拦截器进行登录验证,包括自定义LoginInterceptor的实现以及在WebMvcConfigurer中配置拦截器的行为。重点讲解了preHandle方法的使用及其拦截流程。

HandlerInterceptor拦截器

在web开发中,拦截器是经常用到的功能。它可以帮我们验证是否登陆、权限认证、数据校验、预先设置数据以及统计方法的执行效率等等。spring中拦截器主要分种,一个是HandlerInterceptor,一个是MethodInterceptor。

HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。这两种方法殊途同归,其实HandlerInterceptorAdapter也就是声明了HandlerInterceptor接口中所有方法的默认实现,而我们在继承他之后只需要重写必要的方法。

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
    public HandlerInterceptorAdapter() {
    }

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

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

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }

    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }
}
public interface AsyncHandlerInterceptor extends HandlerInterceptor {
    default void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }
}
public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

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

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

SpringMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。该拦截器只能过滤action请求,Spring允许多个拦截器同时存在,通过拦截器链管理。
当preHandle return true时,执行下一个拦截器,直到所有拦截器执行完,再运行被拦截的请求。
当preHandle return false时, 不再执行后续的拦截器链及被拦截的请求。

在springboot工程基础上创建LoginInterceptor实现HandlerInterceptor接口

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String login_admin = (String) request.getSession().getAttribute("Login_Admin");
        if (null==login_admin){
            response.sendRedirect(request.getContextPath()+"/login");
            return false;
        }
        return true;
    }
}

在config包下定义拦截器配置类,该类实现WebMvcConfigurer接口

import com.wang.chao.micro.log.annotation.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LoginInterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //要拦截的路径
        String[] addInterceptorPaths = {
                "/**"
        };
        //要放行的路径
        String[] exceptInterceptorPaths = {
                "/go/login",
                "/go/error",
        };
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns(addInterceptorPaths).excludePathPatterns(exceptInterceptorPaths);
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值