SpringBoot拦截器详解-HandlerInterceptor

文章目录

    • 拦截器实现
    • 注册拦截器
    • 小结

拦截器实现

实现拦截器需要实现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

你可能感兴趣的:(spring,boot,后端,java)