spring 拦截器

本文介绍了Spring Boot中拦截器的实现及配置。拦截器可对请求处理前后进行业务处理,可通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类来自定义。文中给出了AppPermissionInterceptor和ExecuteTimeInterceptor两个拦截器示例,并展示了如何在Spring Boot中配置扫描这些自定义拦截器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter,可以让Bean 实现HanlderIntercepter接口或者继承HandlerIntercepteorAdapter 类来实现自定义拦截器

  1. AppPermissionInterceptor 拦截器

@Component
@Slf4j
@PropertySource("classpath:application.properties")
public class AppPermissionInterceptor implements HandlerInterceptor {
    @Autowired
    AppInfoMapping appInfoMapping;
    @Autowired
    UserAppService userAppService;
    @Value("${citydo.appno}")
    String appNo;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

        String relativePath = request.getRequestURI();
        if(relativePath.contains("/safe/file")){
            return true;
        }
        String timestamp = null,nonce = null,API_KEY = null,signature = null;
        timestamp = request.getHeader("timestamp");
        nonce = request.getHeader("nonce");
        API_KEY = request.getHeader("API_KEY");
        signature = request.getHeader("signature");
        AppInfo info = new AppInfo();
        info.setAppNo(appNo);
        info.setApiKey(API_KEY);
        AppInfo appInfo = appInfoMapping.findAppInfoByAppNo(info);
        if(appInfo == null){
            returnErrorMessage(response,new ResultPac(-1,"无此App产品,或产品已下架!"));
            return  false;
        }
        int authEnable = appInfo.getAuthEnable();
        if(authEnable == 1){//认证开启
            log.info("接口访问认证拦截器开启!");
            ResultPac authPassResult = userAppService.authentication(timestamp,nonce,API_KEY,signature);
            if(authPassResult.getCode() == 0){
                log.info("接口访问认证拦截器验证通过!");
                return true;
            }else{
                log.error("接口访问认证拦截器验证失败!");
                returnErrorMessage(response,authPassResult);
                return  false;
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }

    private void returnErrorMessage(HttpServletResponse response, ResultPac errorMessage) throws IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json");
        //Get the printwriter object from response to write the required json object to the output stream
        PrintWriter out = response.getWriter();
        String jsonOfRST = JSONObject.toJSONString(errorMessage);
        out.print(jsonOfRST);
        out.flush();
    }

}

  1. 2.ExecuteTimeInterceptorl拦截器

@Component
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter {
    private static final Logger logger = LoggerFactory.getLogger(ExecuteTimeInterceptor.class);

    //before the actual handler will be executed
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);

        return true;
    }

    //after the handler is executed
    @Override
    public void postHandle(
        HttpServletRequest request,
        HttpServletResponse response,
        Object handler,
        ModelAndView modelAndView
    ) {
        long startTime = (Long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        long executeTime = endTime - startTime;

        //log it
        logger.warn("[" + handler + "] executeTime : " + executeTime + "ms");
    }
}
 

 

Springboot 配置扫描自定义拦截器:

@SpringBootConfiguration
public class MySpringMVCConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private AppPermissionInterceptor appPermissionInterceptor;
    @Autowired
    private ApplicationContext applicationContext;

   

//重写addInterceptors 方法,注册拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry){

       //注册appPermissionInterceptor拦截器
        registry.addInterceptor(appPermissionInterceptor).addPathPatterns("/**");

      //注册ExecuteTimeInterceptor拦截器

        registry.addInterceptor(applicationContext.getBean(ExecuteTimeInterceptor.class)).addPathPatterns("/**");

    }

    //文件路径映射
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pic/**")
                .addResourceLocations("file:/var/ftp/fileServer/")
                .addResourceLocations("file:/var/ftp/fileServer/icon/")
                .addResourceLocations("file:/var/ftp/fileServer/function/2x/")
                .addResourceLocations("file:/var/ftp/fileServer/function/3x/");
        registry.addResourceHandler("/pic2/**").addResourceLocations("file:/var/ftp/fileServer2/");
        //registry.addResourceHandler("/icon/**").addResourceLocations("file:/var/ftp/fileServer/icon/");
        super.addResourceHandlers(registry);
    }
    @Bean
    public FilterRegistrationBean wrapperFilterRegistrationBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(applicationContext.getBean(WrapperFilter.class));
        registration.addUrlPatterns("/*");
        registration.setName("wrapperFilter");
        registration.setOrder(1);
        return registration;
    }

    @Bean
    public FilterRegistrationBean encodeFilterRegistrationBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        registration.setFilter(characterEncodingFilter);
        registration.addUrlPatterns("/*");
        registration.setName("encodeFilter");
        registration.setOrder(1);
        return registration;
    }

    @Bean
    public FilterRegistrationBean loggingFilterRegistrationBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        LoggingFilter loggingFilter = new LoggingFilter();
        registration.setFilter(loggingFilter);
        registration.addUrlPatterns("/*");
        registration.setName("loggingFilter");
        registration.setOrder(3);
        return registration;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值