Spring boot开启跨域配置
背景
跨域(Cross-Origin)是指在互联网上的一个域下的文档或脚本尝试请求另一个域下的资源时,域名、协议或端口不同的这种情况。具体来说,如果一个网页试图通过脚本(如JavaScript)从不同源的服务器上请求数据,就会触发浏览器的同源策略限制,导致跨域问题。
同源策略(Same-origin policy)是Web浏览器的一个安全功能,它要求Web浏览器仅允许执行来自同一站点的脚本访问该站点的资源。这意味着,如果网页A尝试访问网页B的资源,且这两个网页的协议、域名或端口号中任何一个不相同,浏览器就会阻止这种访问,以防止恶意网站读取另一个网站的数据。
Spring boot解决跨域问题
一、controller添加注解
在controller层添加@CrossOrigin就可以解决跨域问题
@RestController
@RequestMapping("test")
@Slf4j
@CrossOrigin
public class DemoController {
@RequestMapping("message")
public String test(@RequestBody Message message) {
log.info("{}", JSON.toJSONString(message));
return "test";
}
}
二,全局配置
添加如下全局配置就可以统一配置跨域支持
@Configuration
public class MvcConfig implements WebMvcConfigurer {
/**
* 开启全局跨域配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.maxAge(3600)
.allowCredentials(true);
}
}
三,通过拦截器配置
通过如下拦截器配置,也可以支持跨域
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//表示接受任意域名的请求,也可以指定域名
response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
//这里可以不加,但是其他语言开发的话记得处理options请求
/**
* 非简单请求是对那种对服务器有特殊要求的请求,
* 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。
* 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,
* 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
*/
if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
return true;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
总结
Spring boot解决跨域问题还是很方便的,遇到跨域问题,通过以上方式都可以实现解决