Maison  >  Article  >  Java  >  L'intercepteur SpringBoot renvoie false pour montrer comment résoudre les problèmes inter-domaines

L'intercepteur SpringBoot renvoie false pour montrer comment résoudre les problèmes inter-domaines

WBOY
WBOYavant
2023-05-13 17:10:201686parcourir

Le projet a récemment ajouté une fonction de liste noire et blanche IP. J'ai découvert que si l'intercepteur de filtrage IP renvoie false, le front-end affichera plusieurs domaines. J'ai essayé de modifier la classe de configuration MVC et j'ai constaté que cela ne fonctionnait toujours pas. . Enfin, j'ai ajouté un jugement à l'intercepteur et c'était bien

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // ----------- 加上这个就好了 -----------
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
    }

Classe de configuration WebMvcConfigurer

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

L'intercepteur IP avant 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;
    }
}

L'intercepteur IP modifié

@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;
    }
}

Enfin, la cause du le problème est que l'intercepteur doit juger le gestionnaire dans preHandle. Le type doit être HandlerMethod pour passer

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer