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

被折叠的 条评论
为什么被折叠?



