实现拦截器需要实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类
此处两种方式均写一下
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
System.out.println("preHandle 拦截的请求路径是{}" + requestURI);
// 登录检查逻辑
HttpSession session = request.getSession();
Object loginAdmin = session.getAttribute("loginAdmin");
if (loginAdmin != null) {
// 放行
return true;
}
// 拦截
request.setAttribute("msg", "错误/重新登录");
request.getRequestDispatcher("/login").forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("postHandle 执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("afterCompletion 执行");
}
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class MyInterceptor02 extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
System.out.println("preHandle 拦截的请求路径是{}" + requestURI);
// 登录检查逻辑
HttpSession session = request.getSession();
Object loginAdmin = session.getAttribute("loginAdmin");
if (loginAdmin != null) {
// 放行
return true;
}
// 拦截
request.setAttribute("msg", "错误/重新登录");
request.getRequestDispatcher("/login").forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion 执行");
}
}
一般使用配置类的方式
也有两种方式,一种是直接实现WebMvcConfigurer并重写addInterceptors方法
另一种是通过@Bean的方式在方法内返回一个WebMvcConfigurer内部类。
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 MyWebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/", "/login", "/images/**"); // 放行的请求, 可以根据需要增加
}
}
import org.springframework.context.annotation.Bean;
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 MyWebAppConfigurer02 {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 加入我们的拦截器
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/", "/login", "/images/**");//
}
};
}
}
我亦无他,唯手熟尔
参考文档
https://blog.csdn.net/mmklo/article/details/125574668
https://blog.csdn.net/weixin_51351637/article/details/128058053