Maison  >  Article  >  Java  >  Comment Springboot résout-il les problèmes inter-domaines ?

Comment Springboot résout-il les problèmes inter-domaines ?

不言
不言avant
2019-03-19 10:17:385962parcourir

Le contenu de cet article explique comment Springboot résout les problèmes inter-domaines ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

1. Qu'est-ce qu'une requête HTTP inter-domaines ?

Pour des raisons de sécurité, les navigateurs modernes doivent se conformer à la même politique d'origine lorsqu'ils utilisent l'objet XMLHttpRequest pour lancer HTTP. requêtes, sinon les requêtes HTTP inter-domaines sont interdites par défaut. Les requêtes HTTP inter-domaines font référence aux ressources du domaine A demandant des ressources dans le domaine B. Par exemple, le code js déployé sur Nginx sur la machine A demande l'interface RESTful déployée sur Tomcat sur la machine B via ajax. (Recommandé : Tutoriel vidéo Java)

Une adresse IP (nom de domaine) ou des ports différents entraîneront des problèmes entre domaines. Afin de résoudre les problèmes inter-domaines, il existe des solutions telles que les fichiers jsonp et proxy. Les scénarios d'application étaient limités et les coûts de maintenance étaient élevés jusqu'à ce que HTML5 apporte le protocole CORS.

CORS est une norme du W3C, le nom complet est "Cross-origin Resource Sharing" (Partage de ressources Cross-origin), qui permet aux navigateurs d'émettre des requêtes XMLHttpRequest vers des serveurs d'origine croisée, surmontant ainsi le problème qu'AJAX ne peut être utilisé qu’à partir de la même limite. Il ajoute un en-tête spécial [Access-Control-Allow-Origin] au serveur pour informer le client des restrictions inter-domaines. Si le navigateur prend en charge CORS et détermine que l'origine est transmise, XMLHttpRequest sera autorisé à lancer des requêtes inter-domaines. .

En-tête commun CROS

Access-Control-Allow-Origin : http://somehost.com signifie que http://somehost.com est autorisé à lancer des requêtes inter-domaines.
Access-Control-Max-Age:86400 signifie qu'il n'est pas nécessaire d'envoyer des demandes de pré-vérification dans les 86400 secondes.
Access-Control-Allow-Methods : GET, POST, PUT, DELETE indique les méthodes qui autorisent les requêtes inter-domaines.
Access-Control-Allow-Headers : content-type indique que les requêtes inter-domaines sont autorisées à inclure le type de contenu

2. CORS implémente l'accès inter-domaines

Méthode d'autorisation
Méthode 1 : Renvoyer un nouveau CorsFilter
Méthode 2 : Remplacer WebMvcConfigurer
Méthode 3 : Utiliser les annotations (@CrossOrigin)
Méthode 4 : Définir manuellement l'en-tête de réponse (HttpServletResponse)

Remarque : les méthodes 1 et 2 appartiennent à la configuration CORS globale, et les méthodes 3 et 4 appartiennent à la configuration CORS locale. Si un inter-domaine local est utilisé, il remplacera les règles inter-domaines globales, de sorte que l'annotation @CrossOrigin puisse être utilisée pour un contrôle plus précis des ressources entre domaines.

1. Renvoie le nouveau CorsFilter (inter-domaine global)

package com.hehe.yyweb.config;

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
          //放行哪些原始域
          config.addAllowedOrigin("*");
          //是否发送Cookie信息
          config.setAllowCredentials(true);
          //放行哪些原始域(请求方式)
          config.addAllowedMethod("*");
          //放行哪些原始域(头部信息)
          config.addAllowedHeader("*");
          //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
          config.addExposedHeader("*");

        //2.添加映射路径
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

2. Remplacer WebMvcConfigurer (inter-domaine global)

Toute configuration. classe, renvoie un nouveau bean WebMvcConfigurer et réécrit l'interface de traitement des requêtes inter-domaines qu'elle fournit, dans le but d'ajouter des chemins de mappage et des informations de configuration CORS spécifiques.

package com.hehe.yyweb.config;

@Configuration
public class GlobalCorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            //重写父类提供的跨域请求处理的接口
            public void addCorsMappings(CorsRegistry registry) {
                //添加映射路径
                registry.addMapping("/**")
                        //放行哪些原始域
                        .allowedOrigins("*")
                        //是否发送Cookie信息
                        .allowCredentials(true)
                        //放行哪些原始域(请求方式)
                        .allowedMethods("GET","POST", "PUT", "DELETE")
                        //放行哪些原始域(头部信息)
                        .allowedHeaders("*")
                        //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
                        .exposedHeaders("Header1", "Header2");
            }
        };
    }
}

3. Utiliser les annotations (cross-domaine local)

Utiliser l'annotation @CrossOrigin sur la méthode (@RequestMapping) :

@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080") 
public String index( ){
    return "Hello World";
}

ou dans le contrôleur ( @Controller) à l'aide de l'annotation @CrossOrigin :

@Controller
@CrossOrigin(origins = "http://xx-domain.com", maxAge = 3600)
public class AccountController {

    @RequestMapping("/hello")
    @ResponseBody
    public String index( ){
        return "Hello World";
    }
}
  1. Définir manuellement l'en-tête de réponse (inter-domaine partiel)

Utiliser l'objet HttpServletResponse pour ajouter le en-tête de réponse (Access-Control-Allow-Origin) pour autoriser le domaine d'origine. La valeur de Origin ici peut également être définie sur "*", indiquant que toutes les autorisations sont autorisées.

@RequestMapping("/hello")
@ResponseBody
public String index(HttpServletResponse response){
    response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
    return "Hello World";
}

3. Testez l'accès inter-domaines

Utilisez d'abord Spring Initializr pour créer rapidement un projet Maven sans rien changer. Dans le répertoire statique, ajoutez une page : index.html pour simuler. Accès inter-domaines. Adresse cible : http://localhost:8090/hello

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Page Index</title>
</head>
<body>
<h2>前台系统</h2>
<p id="info"></p>
</body>
<script src="webjars/jquery/3.2.1/jquery.js"></script>
<script>
    $.ajax({
        url: 'http://localhost:8090/hello',
        type: "POST",
        xhrFields: {
           withCredentials: true //允许跨域认证
        },
        success: function (data) {
            $("#info").html("跨域访问成功:"+data);
        },
        error: function (data) {
            $("#info").html("跨域失败!!");
        }
    })
</script>
</html>

Créez ensuite un autre projet, ajoutez le répertoire Config dans le package racine et créez une classe de configuration pour activer CORS global.

package com.hehe.yyweb.config;

@Configuration
public class GlobalCorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

Ensuite, écrivez simplement une interface Rest et spécifiez le port de l'application comme 8090.

package com.hehe.yyweb;

@SpringBootApplication
@RestController
public class YyWebApplication {

    @Bean
    public TomcatServletWebServerFactory tomcat() {
        TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory();
        tomcatFactory.setPort(8090); //默认启动8090端口
        return tomcatFactory;
    }

    @RequestMapping("/hello")
    public String index() {
        return "Hello World";
    }

    public static void main(String[] args) {
        SpringApplication.run(YyWebApplication.class, args);
    }
}

Enfin, démarrez respectivement les deux applications, puis accédez à : http://localhost:8080/index.html dans le navigateur. Les données JSON peuvent être reçues normalement, indiquant que l'accès inter-domaines. c'est réussi ! !


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