前端使用的是react,后端使用的是springboot
1.后端跨域请求的三种方式
a.使用CrosFilter实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CrosConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("http://localhost:3000");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setMaxAge(3600L);
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",buildConfig());
return new CorsFilter(source);
}
}
b.实现WebMvcConfigurer接口,重写addCorsMappings方法
1
2
3
4
5
6
7
8
9
10
11
12
13
public class WebMvcConfig implements WebMvcConfigurer {
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedHeaders("*")
.allowedMethods("*")
.allowCredentials(true)
.maxAge(3600);
}
}
c.在Controller的类或方法上使用注解
1 "http://localhost:3000") (value =
2.前端通过react的axios来发请求实现
以登录发post的请求为例
a.第一种,普通传值方式,传Json对象
1
2
3
4
5 const LoginApi = {
login: async (account) =>{
return await axios.post('http://localhost:8080/login',account);
}
}
此时,后台会接收一个JSON对象的字符串,通过@RequestBody获取即可
b.第二种,利用URLSearchParams进行传值
1
2
3
4
5
6
7
8 const LoginApi = {
login: async ({username,password}) =>{
const params = new URLSearchParams();
params.append('username',username);
params.append('password',password);
return await axios.post('http://localhost:8080/login',params);
}
}
此时,后台会获取一个JSON对象转的字符串拼接的数据(key1=v1&&key2=v2…),使用@RequestParam获取对象中的值
3.说说axiox.post的参数
axios.post(url,data,config)
config:是指一些Content或header的配置
4.URLSearchParams
URLSearchParams的方法,该接口不继承任何属性。
URLSearchParams.append(); //插入一个指定的键/值对作为新的搜索参数。
URLSearchParams.delete(); //从搜索参数列表里删除指定的搜索参数及其对应的值。
URLSearchParams.entries(); //返回一个iterator可以遍历所有键/值对的对象。
URLSearchParams.get(); //获取指定搜索参数的第一个值。
URLSearchParams.getAll(); //获取指定搜索参数的所有值,返回是一个数组。
URLSearchParams.has(); //返回 Boolean 判断是否存在此搜索参数。
URLSearchParams.keys(); //返回iterator 此对象包含了键/值对的所有键名。
URLSearchParams.set(); //设置一个搜索参数的新值,假如原来有多个值将删除其他所有的值。
URLSearchParams.sort(); //按键名排序。
URLSearchParams.toString(); //返回搜索参数组成的字符串,可直接使用在URL上。
URLSearchParams.values(); //返回iterator 此对象包含了键/值对的所有值。
例子1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var paramsString = "q=URLUtils.searchParams&topic=api"
var searchParams = new URLSearchParams(paramsString);
for (let p of searchParams) {
console.log(p);
}
searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"
URLSearchParams 构造函数不会解析完整 URL,但是如果字符串起始位置有 ? 的话会被去除。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var paramsString1 = "http://example.com/search?query=%40";
var searchParams1 = new URLSearchParams(paramsString1);
searchParams1.has("query"); // false
searchParams1.has("http://example.com/search?query"); // true
searchParams1.get("query"); // null
searchParams1.get("http://example.com/search?query"); // "@" (equivalent to decodeURIComponent('%40'))
var paramsString2 = "?query=value";
var searchParams2 = new URLSearchParams(paramsString2);
searchParams2.has("query"); // true
var url = new URL("http://example.com/search?query=%40");
var searchParams3 = new URLSearchParams(url.search);
searchParams3.has("query") // true
5.补充axios.get写法1
2
3
4
5
6
7
8
9
10
11
12
13const AccountApi = {
createAccount: async account => {
await axios.post(`${baseURL}/accounts`, account);
},
get: async id => {
const response = await axios.get(`${baseURL}/accounts/${id}`);
return response.data;
},
get: async () => {
const response = await axios.get(`${baseURL}/accounts`);
return response.data;
}
};