spring-boot - 配置 CORS
问题描述
我有在 Spring Boot 中编写的 REST 服务器,然后我有 Web 服务器(在 Windows 上运行的 IIS,只有 html/css/js 和 web.config 文件)。应用程序只能在本地网络上运行,我不知道如何设置 CORS。
Web 服务器在 docmanager.com 上运行,REST 服务器在 docmanager.com:8443 上运行,两者都在同一台计算机上。问题是,我需要像这样设置 REST 服务器:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
response.setHeader("Access-Control-Max-Age","3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type, access-control-alow-origin");
if("OPTIONS".equalsIgnoreCase(request.getMethod())){
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
response.setHeader("Access-Control-Max-Age","3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type, access-control-alow-origin");
} else {
chain.doFilter(req, res);
}
// chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
@Override
public void destroy() {
}
}
当我使用而不是 Access-Control-Allow-Origin: * -> Acess-Control-Allow-Origin: docmanager.com:443 时,它不起作用。我也在同一台电脑上测试它。我应该如何设置这个与 CORS 相关的东西?我在开发过程中将它与“*”一起使用,但我需要让它准备好分发,但我不知道如何为这个本地网络设置 CORS ......我能否以某种方式避免使用我的设置完全设置 CORS(网络服务器,休息服务器等...)?
感谢帮助 :)
解决方案
正如您提到的,您的 Web 服务器在不同的端口上,而 REST 服务器在不同的端口上
在这种情况下,CORS 肯定会出现。
配置看起来正确。
我认为问题在于您正在设置的域名
docmanager.com:443
不确定,但应该是这样的
https://docmanager.com
尝试检查浏览器并获得确切的值。
旁注
您正在做的是Filter
为每个请求设置标题信息添加一个和。
由于您使用Spring-boot
的是更清洁的方法
使用 WebMvcConfigurerAdapter
@Configuration
//@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter
{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("https://docmanager.com")
.allowedMethods("GET", "POST");
}
}
使用网络安全
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
//other config
}
@Bean
CorsConfigurationSource corsConfigurationSource()
{
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("https://docmanager.com"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
编辑1:
添加更多细节
1 您可以在数组列表中添加所有方法
2 OPTIONS(预请求请求)由 Spring 自动处理。
这是报价
CORS 请求(包括带有 OPTIONS 方法的预检请求)会自动分派到已注册的各种 HandlerMappings。由于 CorsProcessor 实现(默认为 DefaultCorsProcessor),它们处理 CORS 预检请求并拦截 CORS 简单和实际请求,以便添加相关的 CORS 响应标头(如 Access-Control-Allow-Origin)。CorsConfiguration 允许您指定应该如何处理 CORS 请求:允许的来源、标头、方法等。
更多细节在这里
推荐阅读
- php - 登录页面重定向php
- javascript - 制表器 - 如何仅提取数据并保存为 json 对象
- variables - 如何将 @html.HiddenFor 模型值获取到 Razor 变量?
- android - 通知 Activity 网络状态码的模式
- excel - VBA,Pivot 公式包含过去 52 周的数据
- arrays - 批处理脚本上的数组
- sql - 如何使用 SQL 查询不符合预期模式的记录
- sql-server - 查询性能提升建议
- php - Symfony Twig 无法创建 Select2 搜索栏
- java - Netty Http Client:如何将客户端启动、发送请求和客户端关闭分成不同的方法