springBoot 配置拦截器

时间:2025-03-18 08:34:52
用拦截器实现一个登录验证功能

step1:自定义拦截器

import .;
import org.;
import org.;
import ;
import ;
import ;

import ;
import ;
import ;

/**
 * 自定义拦截器
 */
public class MyInterceptor implements HandlerInterceptor {

    private static final Logger logger = ();

    /**
     * 在请求匹配controller之前执行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = ();
        String methodName = ();

        // 判断用户有没有登录,一般登录之后的用户都有一个对应的token
        UnInterception unInterception = ();
        String token = ("token");
        if (null == token || "".equals(token)) {
            ("用户未登录,没有权限执行{}请登录", methodName);
            return false;
        }

        // 返回true才会执行方法,返回false不会执行
        return true;
    }

    /**
     * 已经执行完controller了,但是还没有进入视图渲染
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = ();
        String methodName = ();
        ("已经执行完{}了,但是还没有进入视图渲染", methodName);
    }

    /**
     * 视图也渲染完了,此时我可以做一些清理工作了
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        ("视图也渲染完了,此时我可以做一些清理工作了");
    }
}

step2:配置拦截器

import .;
import ;
import ;
import ;
import ;

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        (new MyInterceptor()).addPathPatterns("/**"); // 拦截所有内容:/** 拦截部分内容:/admin/**
        (registry);
    }

    /**
     * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        ("/**").addResourceLocations(
                "classpath:/static/");
        ("").addResourceLocations(
                "classpath:/META-INF/resources/");
        ("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        (registry);
    }
}

step3:自定义测试controller

@Controller
@RequestMapping("/interceptor")
public class InterceptorController {

    @RequestMapping("/test")
    public String test() {
        return "hello";
    }
}

step4:测试

进入浏览器,输入http://localhost:8080/interceptor/test
结果:无法进入,日志:用户未登录,没有权限执行 test 请登录
进入浏览器,输入http://localhost:8080/interceptor/test?token=1
结果:成功进入