package com.xiaopeng.map.config.interceptor; import com.xiaopeng.unifiedverification.interceptor.CheckForClientInterceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * CheckForClientInterceptor 包装器,用于处理静态资源请求 * 避免 ClassCastException: ResourceHttpRequestHandler cannot be cast to HandlerMethod * * @author xiaopeng */ @Slf4j @Component public class SafeCheckForClientInterceptor implements HandlerInterceptor { @Resource private CheckForClientInterceptor checkForClientInterceptor; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 如果不是 HandlerMethod,说明是静态资源请求,直接放行 if (!(handler instanceof HandlerMethod)) { log.debug("请求 {} 是静态资源请求,跳过 CheckForClientInterceptor 验证", request.getRequestURI()); return true; } // 如果是 HandlerMethod,则调用原始的拦截器进行验证 try { return checkForClientInterceptor.preHandle(request, response, handler); } catch (ClassCastException e) { log.error("CheckForClientInterceptor 发生 ClassCastException,请求: {}, handler: {}", request.getRequestURI(), handler.getClass().getName(), e); // 发生 ClassCastException 时,记录错误但允许请求继续 return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception { // 如果不是 HandlerMethod,直接返回 if (!(handler instanceof HandlerMethod)) { return; } // 调用原始拦截器的 postHandle 方法 try { checkForClientInterceptor.postHandle(request, response, handler, modelAndView); } catch (Exception e) { log.error("CheckForClientInterceptor postHandle 发生异常,请求: {}", request.getRequestURI(), e); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 如果不是 HandlerMethod,直接返回 if (!(handler instanceof HandlerMethod)) { return; } // 调用原始拦截器的 afterCompletion 方法 try { checkForClientInterceptor.afterCompletion(request, response, handler, ex); } catch (Exception e) { log.error("CheckForClientInterceptor afterCompletion 发生异常,请求: {}", request.getRequestURI(), e); } } }