Maison >Java >javaDidacticiel >Quelles sont les façons dont Spring Boot implémente le cross-domain
En raison des restrictions de la politique de même origine du navigateur. La même politique d'origine (Same origin Policy) est une convention. Il s'agit de la fonction de sécurité principale et la plus élémentaire du navigateur. Si la même politique d'origine est manquante, les fonctions normales du navigateur peuvent être affectées. Le Web est construit sur la base de la politique de même origine, et le navigateur n'est qu'un moyen de mettre en œuvre la politique de même origine.
En JavaScript, la politique de même origine limitera les interactions entre différents domaines et empêchera les attaques inter-domaines. La soi-disant même origine (c'est-à-dire dans le même domaine) signifie que les deux pages ont le même protocole, le même hôte et le même numéro de port 2. Qu'est-ce qu'un protocole inter-domaines lorsqu'il s'agit d'un protocole URL de demande, le cas échéant. le nom et le port sont différents de l'URL de la page actuelle, il s'agit d'un cross-domain
3. Restriction non originaleImpossible de contacter le DOM des pages Web non originales
Impossible d'envoyer des requêtes AJAX à des adresses non originales
4 Comment le backend Java implémente les requêtes inter-domaines CORS
Renvoyer un nouveau CorsFilter
Réécrire WebMvcConfigurer
Utiliser l'annotation @CrossOrigin
Définir manuellement l'en-tête de réponse (HttpServletRespon voir)
Filtre Web personnalisé pour obtenir des résultats inter-domaines
Remarque :
CorFilter / WebMvConfigurer / @CrossOrigin nécessite SpringMVC 4.2 ou supérieur, correspondant à springBoot 1.3 ou supérieur
Les deux premières méthodes sont des CORS globaux configuration, tandis que les deux derniers sont une 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.
En fait, quelle que soit la solution, le but ultime est de modifier l'en-tête de réponse, d'ajouter les données requises par le navigateur à l'en-tête de réponse, puis d'obtenir un inter-domaine
1. (inter-domaine global)
@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 corsConfigurationSource = new UrlBasedCorsConfigurationSource(); corsConfigurationSource.registerCorsConfiguration("/**",config); //3. 返回新的CorsFilter return new CorsFilter(corsConfigurationSource); } }
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //是否发送Cookie .allowCredentials(true) //放行哪些原始域 .allowedOrigins("*") .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) .allowedHeaders("*") .exposedHeaders("*"); } }
3. Utiliser les annotations (cross-domain local)
@RestController @CrossOrigin(origins = "*") public class HelloController { @RequestMapping("/hello") public String hello() { return "hello world"; } }
@RequestMapping("/hello") @CrossOrigin(origins = "*") //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域 public String hello() { return "hello world"; }
4. Définissez manuellement l'en-tête de réponse (inter-domaine partiel)
Utilisez l'objet HttpServletResponse pour ajouter l'en-tête de réponse (Access-Control-Allow-Origin) à autoriser. le domaine d'origine, ici Origin's La valeur peut également être définie sur "*", ce qui signifie que tous sont autorisés.
@RequestMapping("/index") public String index(HttpServletResponse response) { response.addHeader("Access-Allow-Control-Origin","*"); return "index"; }
Écrivez d'abord un filtre, qui peut être nommé MyCorsFilter.java
package com.mesnac.aop; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; @Component public class MyCorsFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type"); chain.doFilter(req, res); } public void init(FilterConfig filterConfig) {} public void destroy() {} }
<!-- 跨域访问 START--> <filter> <filter-name>CorsFilter</filter-name> <filter-class>com.mesnac.aop.MyCorsFilter</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 跨域访问 END -->
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!