- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring boot跨域设置实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
定义:跨域是指从一个域名的网页去请求另一个域名的资源 。
1.原由 。
公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就属于跨域 。
本人是springboot菜鸟,但是做测试框架后端需要使用Springboot和前端对接,出现跨域问题,需要设置后端Response的Header.走了不少坑,在这总结一下以备以后使用 。
2.使用场景 。
浏览器默认不允许跨域访问,包括我们平时ajax也是限制跨域访问的.
产生跨域访问的情况主要是因为请求的发起者与请求的接受者1、域名不同;2、端口号不同 。
如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题 。
3.解决方案 。
通过设置Access-Control-Allow-Origin来实现跨域访问 。
4.具体解决 。
刚开始使用http://www.jianshu.com/p/f2060a6d6e3b设置,但是由于我们使用的spring版本的问题,CorsConfiguration类需要4.2.7版本。和我们使用的spring里面版本不一致,导致版本冲突或者各种问题 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Configuration
public
class
CorsConfig {
private
CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration =
new
CorsConfiguration();
corsConfiguration.addAllowedOrigin(
"*"
);
// 1
corsConfiguration.addAllowedHeader(
"*"
);
// 2
corsConfiguration.addAllowedMethod(
"*"
);
// 3
return
corsConfiguration;
}
@Bean
public
CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source =
new
UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration(
"/**"
, buildConfig());
// 4
return
new
CorsFilter(source);
}
}
|
后来改为Filter方式 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Component
public
class
CorsFilter
implements
Filter {
final
static
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.
class
);
public
void
doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws
IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader(
"Access-Control-Allow-Origin"
,
"*"
);
response.setHeader(
"Access-Control-Allow-Credentials"
,
"true"
);
response.setHeader(
"Access-Control-Allow-Methods"
,
"POST, GET, OPTIONS, DELETE"
);
response.setHeader(
"Access-Control-Max-Age"
,
"3600"
);
response.setHeader(
"Access-Control-Allow-Headers"
,
"x-requested-with"
);
chain.doFilter(req, res);
}
public
void
init(FilterConfig filterConfig) {}
public
void
destroy() {}
}
|
后来改为Filter方式 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Component
public
class
CorsFilter
implements
Filter {
final
static
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.
class
);
public
void
doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws
IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader(
"Access-Control-Allow-Origin"
,
"*"
);
response.setHeader(
"Access-Control-Allow-Credentials"
,
"true"
);
response.setHeader(
"Access-Control-Allow-Methods"
,
"POST, GET, OPTIONS, DELETE"
);
response.setHeader(
"Access-Control-Max-Age"
,
"3600"
);
response.setHeader(
"Access-Control-Allow-Headers"
,
"x-requested-with"
);
chain.doFilter(req, res);
}
public
void
init(FilterConfig filterConfig) {}
public
void
destroy() {}
}
|
网上很多资料都是教按以上方法设置,但是我这里就是设置不成功的。出现下面问题 。
1
|
<span style="color:#ff0000;">Fetch API cannot load https://atfcapi.alpha.elenet.me/atfcapi/project/mainPageList. The value of the 'Access-Control-Allow-Origin' </span>
|
1
|
<span style="color:#ff0000;">header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'https://atfcapi-test.faas.elenet.me' is therefore not allowed access.</span>
|
目前为止,不知道为什么这样配置不可以,然后改为设置单个域名,如下显示 。
1
|
response.setHeader(
"Access-Control-Allow-Origin"
,
"https://atfcapi-test.faas.elenet.me"
);
|
这样设置就成功了,但是我们有好几个环境,同一套代码,写死一个域名并解决不了问题, 按照很多网络文章中所说,设置多个域名如下:
1
|
response.setHeader(
"Access-Control-Allow-Origin"
,
"https://atfcapi-test.faas.elenet.me,https://atfcapi-test-beta.faas.elenet.me"
);
|
但是设置完以后,并不好用,出现如下错误信息:
1
|
<span style="color:#ff6666;">Fetch API cannot load https://atfcapi.alpha.elenet.me/atfcapi/project/getProjects. The 'Access-Control-Allow-Origin' header contains multiple values </span>
|
1
|
<span style="color:#ff6666;">'https://atfcapi-test.faas.elenet.me,https://atfcapi-test-beta.faas.elenet.me', but only one is allowed. Origin 'https://atfcapi-test.faas.elenet.me' is therefore not allowed access. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.</span>
|
设置为以下方式也还是错误:
1
2
|
response.setHeader(
"Access-Control-Allow-Origin"
,
"https://atfcapi-test.faas.elenet.me"
);
response.setHeader(
"Access-Control-Allow-Origin"
,
"https://atfcapi-test-beta.faas.elenet.me"
);
|
最后采用了一种和设置为* 的方式一样的办法,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Component
public
class
CorsFilter
implements
Filter {
final
static
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.
class
);
public
void
doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws
IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader(
"Access-Control-Allow-Origin"
,reqs.getHeader(
"Origin"
));
response.setHeader(
"Access-Control-Allow-Credentials"
,
"true"
);
response.setHeader(
"Access-Control-Allow-Methods"
,
"POST, GET, OPTIONS, DELETE"
);
response.setHeader(
"Access-Control-Max-Age"
,
"3600"
);
response.setHeader(
"Access-Control-Allow-Headers"
,
"x-requested-with"
);
chain.doFilter(req, res);
}
public
void
init(FilterConfig filterConfig) {}
public
void
destroy() {}
}
|
从request 中的header中获取Origin,来做配置,最终成功并满足需求。 其实有些东西还是一知半解,但是起码曲线救国也是一种解决方法.
总结 。
以上就是本文关于Spring boot跨域设置实例详解的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。
原文链接:http://blog.csdn.net/u011517841/article/details/68490586 。
最后此篇关于Spring boot跨域设置实例详解的文章就讲到这里了,如果你想了解更多关于Spring boot跨域设置实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这是我的本地域名 http://10.10.1.101/uxsurvey/profile/dashboard 在 Controller 中,我为用户列表设置了一个操作 redirect(control
要处理 Canonical URL,最佳做法是执行 301 重定向还是更好地为 www 和非 www 域使用相同的 IP 地址? 例如: 想要的规范 URL/域是 http://example.com
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我想创建一个 weblogic 集群,其中有两个托管服务器,每个服务器在物理上独立的远程计算机上运行 根据weblogic文档 All Managed Servers in a cluster mus
我正在运行 grails 3.1.4,但在创建允许我将多个域对象绑定(bind)到其他几个域对象的模式时遇到了问题。作为我正在尝试做的一个例子: 我有三个类(class)。书籍、作者和阅读列表。 作者
我试图使用@count函数来根据它获取数据,但是在没有崩溃报告的情况下它以某种方式崩溃了。 这是代码 class PSMedia: Object { @objc dynamic var id
有谁知道是否有办法只输入字母字符而不输入数字?我想过这样的事情 CREATE DOMAIN countryDomain AS VARCHAR(100) CHECK( VALUE ??? );
我的代码: const checkoutUrl = 'https://example.com/checkout/*' window.onload = startup() function st
一些不是我编写的应用程序,也不是用 PHP 编写的,它为域 www.example.com 创建了一个 cookie。 我正在尝试替换该 cookie。所以在 PHP 中我做到了: setcookie
什么是 oauth 域?是否有任何免费的 oauth 服务?我可以将它用于 StackApps registration 吗? ?我在谷歌上搜索了很多,但找不到答案。 最佳答案 这是redirect_
自从 In October 2009, the Internet Corporation for Assigned Names and Numbers (ICANN) approved the cre
我使用 apache 作为我的应用程序 Web 服务器的代理,并希望即时更改与 sessionid cookie 关联的域名。 该cookie有一个与之关联的.company.com域,我想使用apa
我只想托管一个子域到cloudflare。我不想将主域名的域名服务器更改为他们的域名服务器。真的有可能吗? 最佳答案 是的,这是可能的,但是需要通过CloudFlare合作伙伴进行设置,或者您需要采用
When using socket in the UNIX domain, it is advisable to use path name for the directory directory m
想象两个共享一个域类的 Grails 应用程序。也许是 Book 域类。 一个应用程序被标识为数据的所有者,一个应用程序必须访问域数据。类似于亚马逊和亚马逊网络服务。 我想拥有的应用程序将使用普通的域
我有一个包含字段“URL”的表单。第一部分需要用户在文本框中填写。第二部分是预定义的,显示在文本框的右侧。 例如,用户在文本框中输入“test”。第二部分预定义为“.example.com”。因此,总
如果我要关闭并取消分配 azure 中的域 Controller ,从而生成新的 vm Generationid,我需要采取哪些步骤来恢复它? 最佳答案 what steps do I need to
我想尝试使用 Azure 作为托管提供商(我有一个域)。我读过那篇文章https://learn.microsoft.com/en-us/azure/app-service-web/web-sites
所以.... 我想知道是否有人可以在这方面协助我? 基本上,我已经创建了一个自托管的Docker容器,用作构建代理(Azure DevOps) 现在,我已经开始测试代理,并且由于我们的放置文件夹位于W
我是一名优秀的程序员,十分优秀!