您好,登錄后才能下訂單哦!
Springboot2.X如何全方位解決Cors跨域,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1.1、什么是Cors?
直接解釋為跨域,是一個比jsonp更優秀的存在,JSONP只支持Get請求,CORS支持所有類型的HTTP請求。
1.2、什么是跨域?
同源是指,域名、協議、端口均為相同,如果三者有其一不同,都算作跨域,A網站的ajax訪問B網站的接口就是跨域,如下解釋
非跨域: http://www.osc.com/index.html 調用 http://www.osc.com/index.php 非跨域跨 域: http://www.osc.com/index.html 調用 http://www.qq.com/index.php 跨域,主域不同 http://abc.osc.com/index.html 調用 http://def.osc.com/server.php 跨域,子域名不同 http://www.osc.com:8080/index.html 調用 http://www.osc.com/server.php 跨域,端口不同 https://www.osc.com/index.html 調用 http://www.osc.com/server.php 跨域,協議不同(https和http的區別)
準備2個Springboot項目,不同端口號,A項目ajax訪問B項目接口,算是跨域訪問,我會把所有用到的代碼都放到上面,省的大家評論為啥我這不行...
A項目:springboot+freemaker
2.1、pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.2、application.properties
server.port=8089 server.servlet.context-path=/tssd #thymeleaf spring.mvc.view.prefix=classpath:/templates/ spring.mvc.view.suffix=.html spring.thymeleaf.cache=false spring.mvc.static-path-pattern=/** spring.resources.static-locations =classpath:/static/ spring.thymeleaf.mode=LEGACYHTML5
2.3、controller
@Controller public class EveryController { @RequestMapping(value = "/every/{url}") public String toEveryUrl(@PathVariable("url") String url){ return url; } }
2.4、templates文件夾下index.html,現在此ajax訪問的是8082,所以B項目端口號必須是8082
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>xixi</title> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> </head> <body> i love you,my beast love girl aoxin <script> $(function() { $.ajax({ url : "http://localhost:8082/test", type : "POST", dataType: "json", success : function(data) { alert(data.data); }, error: function () { alert("錯誤"); } }); }) </script> </body> </html>
一會我們就直接通過接口 http://localhost:8089/tssd/every/index 就直接到了index.html,然后頁面加載函數ajax請求B項目接口。
3.1、pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.2、application.properties
server.port=8082
3.3、實體類
@Data @AllArgsConstructor public class Result { private boolean success; private String code; private String message; private Object data; public Result() { this.success = true; this.code = "200"; } }
然后其他的就先不需要配置了,到此為止,B項目結束。
是針對某一個接口解決跨越問題。
在B項目中,使用注解在方法上,這樣我們這個方法就可以被跨域了。
@CrossOrigin(origins = "http://localhost:8089",maxAge = 3600) @RequestMapping(value = "/test",method = RequestMethod.POST) @ResponseBody public Result testOne(){ Result result = new Result(); result.setData("fjsd"); return result; }
http://localhost:8089/tssd/every/index
把方法一作用在方法上的注解CrossOrigin作用到類上,這樣,該類的所有方法都可以被跨域。
@Controller @CrossOrigin(origins = "http://localhost:8089",maxAge = 3600) public class FirstController { @RequestMapping(value = "/test",method = RequestMethod.POST) @ResponseBody public Result testOne(){ Result result = new Result(); result.setData("fjsd"); return result; } }
成功截圖和上面是一樣的,但是實現方式是不一樣的。當然,如果你的注解只寫成
@CrossOrigin(maxAge = 3600)
那么它是可以允許任何網站都可以訪問的,已經測試了,大家可以把origins去掉就可以了origins
把方法一、方法二的注解去掉,添加全局配置,配置可以跨域的接口路徑等等。
@Configuration public class MyCrosConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/test") .allowedOrigins("http://localhost:8089") .allowedMethods("PUT", "DELETE","POST","GET") .allowedHeaders("*") .maxAge(3600); } }
可以把之前的三個方法的注解或者@Configuration都去掉,接下里我們用第四種方法測試。
@Configuration public class CrosFilter { @Bean CorsFilter getCorsFilter(){ CorsConfiguration cors = new CorsConfiguration(); cors.setAllowCredentials(true); cors.addAllowedMethod("*"); cors.addAllowedOrigin("*"); cors.setMaxAge(3600L); cors.addAllowedHeader("*"); cors.applyPermitDefaultValues(); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**",cors); CorsFilter corsFilter = new CorsFilter(source); return corsFilter; } }
結果:成功。
其實不僅僅有局部方法、局部類、全局配置以及過濾器方法,還有xml方式,只不過個人不喜歡,所以就不介紹給大家,畢竟Springboot不提倡用xml,喜歡的話可以關注我,嘻嘻。
關于Springboot2.X如何全方位解決Cors跨域問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。