我将Spring Boot v2.1.1.RELEASE与Spring Security一起使用,并试图通过REST登录到应用程序。
我有一个实现WebMvcConfigurer
的配置文件,因此可以覆盖addCorsMappings方法:
@Override
public void addCorsMappings(final CorsRegistry registry) {
registry.addMapping("/**");
}
这很好用;我可以将登录数据发送到http://localhost:8080/login
并获得正常的响应,包括会话cookie和所有内容:
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Sun, 20 Jan 2019 13:14:46 GMT
Expires: 0
Pragma: no-cache
Set-Cookie: JSESSIONID=66B74AE4F547BA77604AE199E0A48D7E; Path=/; HttpOnly
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
注意Access-Control-Allow-Origin
标头。
但是,如果我按如下方式指定允许的来源,则Response不包括前面提到的标头:
@Override
public void addCorsMappings(final CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("localhost");
}
将导致响应:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 20
Date: Sun, 20 Jan 2019 13:15:15 GMT
Expires: 0
Pragma: no-cache
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
我允许哪个来源都没有关系; “ http://localhost”,“ http://example.com”和“ example.com”都得到相同的结果。
在调试时,我注意到在代码中包含allowedOrigins
位时,身份验证过程在CorsFilter处停止。
这与登录过程有关!据我所知,我无法使用@CrossOrigin
注释,因为我没有办法将其放在上面。
我正在使用以下脚本测试REST登录:https://pastebin.com/YezC3wWr
这是Spring还是设计上的错误?我在这里想念东西吗?
编辑:仅当请求是从允许的来源发送时才发送响应中的“ Access-Control-Allow-Origin”标头,而事实并非如此。我将HTML测试文件托管在http://localhost:8000
上,因此必须在服务器上允许的来源中添加此确切URL 。不是localhost
,不是localhost:8000
,而是http://localhost:8000
。然后身份验证成功,并且标头也包含在响应中。
答案 0 :(得分:1)
如果您在与登录请求相同的域上运行HTML页面,则请求中将没有Origin
标头,因此没有Access-Control-Allow-Origin
。
您的代码就是这种情况吗?您在http://localhost:8080/
下运行HTML文件吗?
如果否,请从浏览器的控制台中发布错误。 另外,如果您可以同时发布请求和响应标头,那就太好了
答案 1 :(得分:0)
尝试使用“ http://localhost:8080”。 您是通过网络浏览器还是直接通过POST(例如Postman)进行测试?