一阱高、跨域問題描述
Web開發(fā)經(jīng)常會(huì)遇到跨域問題悲靴,解決方案有:jsonp衔蹲,iframe坚踩,CORS等等。
CORS 與 JSONP 相比:
1毡惜、 JSONP 只能實(shí)現(xiàn) GET 請(qǐng)求拓轻,而 CORS 支持所有類型的 HTTP 請(qǐng)求。
2经伙、 使用 CORS扶叉,開發(fā)者可以使用普通的 XMLHttpRequest 發(fā)起請(qǐng)求和獲得數(shù)據(jù),比起 JSONP 有更好的 錯(cuò)誤處理帕膜。
3枣氧、 JSONP 主要被老的瀏覽器支持,它們往往不支持 CORS垮刹,而絕大多數(shù)現(xiàn)代瀏覽器都已經(jīng)支持了 CORS达吞。
二、CORS常用的三種解決跨域問題的方法
這里我僅僅寫出一個(gè)需要被跨域訪問的方法荒典,提出了三種解決方案酪劫。
需要被跨域訪問的方法:
package com.lemon.springboot.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author lemon
*/
@RestController
@RequestMapping("/api")
public class ApiController {
private static final Logger logger = LoggerFactory.getLogger(ApiController.class);
// @CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
@RequestMapping("/get")
public Map<String, Object> get(@RequestParam String name) {
Map<String, Object> map = new HashMap<>();
map.put("title", "hello world");
map.put("name", name);
return map;
}
}
1、配置全局跨域訪問解決方案
寫一個(gè)配置類寺董,指定可以被跨域訪問的路徑以及可以跨域的主機(jī)鏈接覆糟。這樣,8081和8082端口的應(yīng)用就可以訪問/api后所有的方法或者資源遮咖。
package com.lemon.springboot.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 全局配置跨域問題
* @author lemon
*/
@Configuration
public class CustomCorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 設(shè)置了可以被跨域訪問的路徑和可以被哪些主機(jī)跨域訪問
registry.addMapping("/api/**").allowedOrigins("http://localhost:8081", "http://localhost:8082");
}
};
}
}
2滩字、第二種全局設(shè)置方法
package com.lemon.springboot.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* @author lemon
*/
@Configuration
public class CustomCorsConfiguration2 extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 設(shè)置了可以被跨域訪問的路徑和可以被哪些主機(jī)跨域訪問
registry.addMapping("/api/**").allowedOrigins("http://localhost:8081", "http://localhost:8082");
}
}
3、使用@CrossOrigin注解實(shí)現(xiàn)細(xì)粒度控制(推薦使用)
直接在需要被跨域訪問的方法上加上@CrossOrigin注解就可以實(shí)現(xiàn)被跨域訪問盯滚。
package com.lemon.springboot.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author lemon
*/
@RestController
@RequestMapping("/api")
public class ApiController {
private static final Logger logger = LoggerFactory.getLogger(ApiController.class);
@CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
@RequestMapping("/get")
public Map<String, Object> get(@RequestParam String name) {
Map<String, Object> map = new HashMap<>();
map.put("title", "hello world");
map.put("name", name);
return map;
}
}
這三種配置方法踢械,當(dāng)其他系統(tǒng)內(nèi)的資源跨域訪問的時(shí)候,就會(huì)起作用魄藕!