Maison > Java > javaDidacticiel > 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
Libérer: 2023-05-13 17:10:20
avant
1776 Les gens l'ont consulté

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;
        }
    }
Copier après la connexion

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);
    }
}
Copier après la connexion

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;
    }
}
Copier après la connexion

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;
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal