Maison  >  Article  >  Java  >  Introduction au cross-domain SpringBoot (exemple de code)

Introduction au cross-domain SpringBoot (exemple de code)

不言
不言avant
2019-02-22 13:12:163261parcourir

Cet article vous présente une introduction au cross-domain SpringBoot (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Avant-propos : Pour une raison quelconque, le projet SpringBoot de l'entreprise gère souvent certaines requêtes inter-domaines.

Un. Dans le passé, j'ai écrit un cours pour gérer le traitement inter-domaines en consultant les informations pertinentes, comme suit.

1.1 Définissez d'abord un filtre (interception de toutes les requêtes, y compris les requêtes inter-domaines)

public class CrossDomainFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {     
        HttpServletRequest hreq = (HttpServletRequest) request;  //
        HttpServletResponse hresp = (HttpServletResponse) response; 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*");  //设置相应头
        //跨域 Header
        hresp.setHeader("Access-Control-Allow-Methods", "*");
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,x-requested-with,requesttype");
        //header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype');
        // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求
        // 配置options的请求返回
        if (hreq.getMethod().equals("OPTIONS")) {  //如果发现该请求为OPTION,则直接返回(不需要进入系统),并且设置相应信息
            hresp.setStatus(200);
            // hresp.setContentLength(0);
            hresp.getWriter().write("OPTIONS returns OK");
            return;
        }
        // Filter 只是链式处理,请求依然转发到目的地址。
        chain.doFilter(request, response);
    }
}

1.2 Enregistrez une classe de configuration ( Configuration), enregistrez la classe de filtre définie ci-dessus dans l'environnement contextuel

@Configuration
public class WebConfiguration {
    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }
    @Bean
    public FilterRegistrationBean<CrossDomainFilter> testFilterRegistration() {
        FilterRegistrationBean<CrossDomainFilter> registration = new FilterRegistrationBean<CrossDomainFilter>();
        registration.setFilter(new CrossDomainFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    }
}

Remarque : Cette classe de configuration résout principalement le problème de l'interception de ces requêtes par le filtre nous avons écrit (CrossDomainFilter)

2. La propre solution de SpringBoot pour le filtre inter-domaines (CorsFilter) Le code source de ce filtre est très simple. Vous pouvez visualiser directement la méthode doFilterInternal() de la classe, car cela. La méthode sera appelée dans la méthode doFilter() (on peut comprendre qu'il s'agit de la méthode doFilter() de Filter).

Le processus de traitement accepte également la méthode OPTION et répond par 200 et renvoie.

@Configuration
@EnableAutoConfiguration
public class CrossOriginconfig {
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 设置你要允许的网站域名,如果全允许则设为 *
        corsConfiguration.addAllowedOrigin("*");
        // 如果要限制 HEADER 或 METHOD 请自行更改
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        System.out.println("confi init");
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

3 : Résumé personnel des problèmes inter-domaines

Le navigateur détecte d'abord les problèmes inter-domaines avant d'envoyer une requête, et avant d'envoyer une requête inter-domaine, une requête de type OPTIONS est envoyée (l'adresse de la requête reste inchangée et l'en-tête de la requête contient d'autres informations. La requête doit recevoir une réponse du serveur (veuillez vérifier CrossDomainFilter si la requête). ne le fait pas. Si une réponse est reçue, le navigateur n'enverra pas la véritable demande.

3.1 : Demande d'OPTION envoyée par le navigateur (demande provisoire)

Remarque : Sur l'image, nous avons constaté que l'adresse de la demande reste inchangée () , la méthode de requête est OPTION et l'en-tête de la requête contient des informations. Ces informations peuvent indiquer que je fais une requête inter-domaines et la méthode de requête est POST. .

3.2 : Le serveur doit répondre à la demande (veuillez vérifier CrossDomainFilter)

1) Définissez d'abord l'en-tête correspondant (indiquez au navigateur quelques informations sur les requêtes inter-domaines que je prends en charge)

2) Définir le statut correspondant à 200, et renvoyer des données (données arbitraires)

3.3 : Le navigateur a reçu la réponse à la requête OPTION (le serveur accepte le cross-domain), donc n'hésitez pas à envoyer la vraie demande comme suit

1) Comparez la demande OPTION, l'adresse de la demande n'a pas changé ^_^

2 ) Comparez la méthode de requête, la requête est POST et la requête POST est dans OPTIN Le serveur a été informé (Access-Control-Request-Method).

3) En comparant l'en-tête de la requête OPTION, cette requête n'a pas de paramètres liés à Access-Control-Allow-****.

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