拦截器 -2025/1/21

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    • 在指定的方法调用前后执行预先设定的代码
    • 阻止原始方法的执行
    • 总结:拦截器就是用来做增强

ProjectInterceptor

package com.stdu.controller.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    //原始方法调用前执行的内容
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod hm = (HandlerMethod)handler;
        String methodName = hm.getMethod().getName();//可以获取方法的名称
        System.out.println("preHandle..."+methodName);
        return true;
    }

    @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...");
    }
}


SpringMvcSupport

package com.stdu.config;

import com.stdu.controller.interceptor.ProjectInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * 配置类,用于配置 Spring MVC 相关设置。
 */
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {

    // 自定义拦截器,通过 @Autowired 注入
    @Autowired
    private ProjectInterceptor projectInterceptor;

    /**
     * 添加静态资源处理器,配置静态资源的映射路径。
     * 
     * @param registry 资源处理器注册表
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 当访问 /pages/** 时,从 /pages/ 目录下查找内容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        // 当访问 /js/** 时,从 /js/ 目录下查找内容
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        // 当访问 /css/** 时,从 /css/ 目录下查找内容
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        // 当访问 /plugins/** 时,从 /plugins/ 目录下查找内容
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }

    /**
     * 添加拦截器,配置拦截器的路径模式。
     * 
     * @param registry 拦截器注册表
     */
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 添加自定义拦截器,拦截路径为 /books 和 /books/* 的请求
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books", "/books/*");
    }
}

1

posted @   XYu1230  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示