代码下载地址:本博客示例代码
第一步:创建前端页面 项目结构图DOCTYPE html>
添加部门
$(function () {
$.ajax({
url: "http://localhost/ky/fun", //假设服务器端请求的url
data: {p: "helloworld"},
dataType: "json",
success: function (res) {
res = JSON.stringify(res);
console.log(res);
$("#show").text(res);
}
});
});
第二步:创建SpringBoot项目
添加Maven依赖
org.springframework.boot
spring-boot-starter-web
Controller代码
@RestController
public class DemoController {
@RequestMapping("/fun")
public String fun(String p){
System.out.println("param "+p);
return "{\"name\":\"zhangsan\"}";
}
}
第三步:具体实现跨域的方法
方法一:重写WebMvcConfigurer(全局跨域)
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//添加映射路径
registry.addMapping("/**")
//是否发送Cookie
.allowCredentials(true)
//设置放行哪些原始域
.allowedOriginPatterns("*")
//放行哪些请求方式
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
//.allowedMethods("*") //或者放行全部
//放行哪些原始请求头部信息
.allowedHeaders("*")
//暴露哪些原始请求头部信息
.exposedHeaders("*")
.maxAge(3600);
}
}
说明:
- addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
- allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:“http://www.baidu.com”,只有百度可以访问我们的跨域资源。
- allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以
- allowedMethods:允许输入参数的请求方法访问该跨域资源服务器,如:POST、GET、PUT、OPTIONS、DELETE等。
- allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:“X-YAUTH-TOKEN”
- maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。
下面代码也可以写成如下形式:
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
// 重写父类提供的跨域请求处理的接口
@Override
public void addCorsMappings(CorsRegistry registry) {
// 添加映射路径
registry.addMapping("/**")
// 放行哪些原始域
.allowedOriginPatterns("*")
// 是否发送Cookie信息
.allowCredentials(true)
// 放行哪些原始域(请求方式)
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
// 放行哪些原始域(头部信息)
.allowedHeaders("*")
// 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
.exposedHeaders("Header1", "Header2")
// 预请求的结果有效期,默认1800分钟,3600是一小时
.maxAge(3600);
}
};
}
}
方法二:自定义Filter解析跨域(全局跨域)
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootConfiguration
public class WebGlobalConfig {
@Bean
public CorsFilter corsFilter() {
//创建CorsConfiguration对象后添加配置
CorsConfiguration config = new CorsConfiguration();
//设置放行哪些原始域
//config.addAllowedOrigin("*"); // 旧版本
config.addAllowedOriginPattern("*"); //新版本
//放行哪些原始请求头部信息
config.addAllowedHeader("*");
//暴露哪些头部信息
config.addExposedHeader("*");
//放行哪些请求方式
config.addAllowedMethod("GET"); //get
config.addAllowedMethod("PUT"); //put
config.addAllowedMethod("POST"); //post
config.addAllowedMethod("DELETE"); //delete
//corsConfig.addAllowedMethod("*"); //放行全部请求
//是否发送Cookie
config.setAllowCredentials(true);
//2. 添加映射路径
UrlBasedCorsConfigurationSource corsConfigurationSource =
new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**", config);
//返回CorsFilter
return new CorsFilter(corsConfigurationSource);
}
}
在SpringBoot2.4.4之后,当allowCredentials为true时,alloedOrigins不能包含特殊值“*”,因为该值不能在“Access-Control-Allow-Origin”响应头部中设置。要允许凭据访问一组来源,请显式列出它们或考虑改用“AllowedOriginPatterns”。
上面自定义Filter解析跨域的代码也可以写成如下形式:
@WebFilter
@Configuration
public class CorsFilter implements Filter {
@Override
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-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
chain.doFilter(req, res);
}
}
方法三:@CrossOrigin注解(局部跨域)
在Controller类或者处理用户请求的方法上加@CrossOrigin注解。 假设前端请求页面的网址为:http://localhost:63342/kuayu/frontend/demo.html,则:
@CrossOrigin(origins = "http://localhost:63342", maxAge = 3600)
@RestController
public class DemoController {
@RequestMapping("/fun")
public String fun(String p){
System.out.println("param "+p);
return "{\"name\":\"zhangsan\"}";
}
}