The project recently added an IP black and white list function. I found that if the IP filtering interceptor returns false, the front end will display cross-domain. After trying to modify the MVC configuration class, I found that it still didn't work. Finally, I added a judgment to the interceptor.
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // ----------- 加上这个就好了 ----------- if (!(handler instanceof HandlerMethod)) { return true; } }
WebMvcConfigurer configuration class
@Configuration @RestControllerAdvice public class WebMvcConfig implements WebMvcConfigurer { @Resource private IpFilterInterceptor ipFilterInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // IP拦截器 registry.addInterceptor(ipFilterInterceptor) .addPathPatterns("/**") .order(5); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(true) .allowedOriginPatterns("*") .allowedMethods("*") .allowedHeaders("*") .maxAge(3600); } }
IP interceptor before modification
@Component public class IpFilterInterceptor implements HandlerInterceptor { /** * 是否启用 */ private boolean enable; /** * 是否为白名单 */ private boolean isWhiteList; /** * 过滤器 */ private List<String> filters; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // 停用 if (!enable) { return true; } String ip = Servlets.getRemoteAddr(request); // 本机不过滤 if (Const.LOCALHOST_IP_V4.equals(ip)) { return true; } // 过滤 boolean contains = false; for (String filter : filters) { if (Strings.isBlank(filter)) { continue; } // 检测 contains = Utils.checkIpIn(ip, filter); if (contains) { break; } } // 结果 boolean pass; if (isWhiteList) { pass = contains; } else { pass = !contains; } // 返回 if (!pass) { response.setContentType(StandardContentType.APPLICATION_JSON); Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes()); } return pass; } }
IP after modification Interceptor
@Component public class IpFilterInterceptor implements HandlerInterceptor { /** * 是否启用 */ private boolean enable; /** * 是否为白名单 */ private boolean isWhiteList; /** * 过滤器 */ private List<String> filters; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // 停用 if (!enable) { return true; } // ----------- 加上这个就好了 ----------- if (!(handler instanceof HandlerMethod)) { return true; } String ip = Servlets.getRemoteAddr(request); // 本机不过滤 if (Const.LOCALHOST_IP_V4.equals(ip)) { return true; } // 过滤 boolean contains = false; for (String filter : filters) { if (Strings.isBlank(filter)) { continue; } // 检测 contains = Utils.checkIpIn(ip, filter); if (contains) { break; } } // 结果 boolean pass; if (isWhiteList) { pass = contains; } else { pass = !contains; } // 返回 if (!pass) { response.setContentType(StandardContentType.APPLICATION_JSON); Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes()); } return pass; } }
Finally, the cause of the problem is that the interceptor needs to determine in preHandle that the type of handler must be HandlerMethod in order to pass
The above is the detailed content of SpringBoot interceptor returns false to show how to solve cross-domain problems. For more information, please follow other related articles on the PHP Chinese website!