gpt4 book ai didi

java - Spring 4.2.0.RC2 和 Tomcat 8.0.23 的 CORS 问题

转载 作者:搜寻专家 更新时间:2023-11-01 02:06:37 25 4
gpt4 key购买 nike

在我使用 Spring 4.1.x 版本并拥有自己的 Cors 过滤器和拦截器之前。我也在使用 Tomcat 8.0.8 一切都很好。

当我将相同的应用程序移动到 Tomcat 8.0.23 时,CORS 停止工作。

因此,从我的 POM 开始,我已将应用程序更新为以下版本的 Spring 依赖项:

org.springframework: 4.2.0.RC2
org.springframework.security: 4.0.1.RELEASE
org.springframework.security.oauth2: 2.0.7.RELEASE
org.springframework.ws.version: 2.2.0.RELEASE
spring.data.commons.core.version: 1.4.1.RELEASE

现在,我还更新了我的 securityConfiguration.xml 以获得安全 4.0.1.RELEASE 的正确架构。

应用程序运行良好,除了 CORS 之外的所有更改都完美无缺。

所以我按照说明将以下内容添加到我的 WebMvcConfigurerAdapter 实现类中:

@Override
public void addCorsMappings(CorsRegistry registry) {
Properties prop = null;

try {

InputStream in = getClass().getResourceAsStream(
"/com/nando/config/cors.properties");
prop = new Properties();
prop.load(in);
in.close();
} catch (IOException e) {
prop = null;
}

if (prop != null) {
String domains = prop.getProperty("allowed.origins");

List<String> allowedOrigins = new ArrayList<String>(
Arrays.asList(domains.split(",")));

if (allowedOrigins.size() > 0) {
String[] arrayOrigins = null;
arrayOrigins = new String[allowedOrigins.size()];
arrayOrigins = allowedOrigins.toArray(arrayOrigins);
registry.addMapping("/**")
.allowedOrigins(arrayOrigins)
.allowedMethods("PUT, POST, GET, OPTIONS, DELETE")
.allowedHeaders("*")
.exposedHeaders("Authorization", "Content-Type")
.allowCredentials(false).maxAge(3600);
}
} else {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("PUT, POST, GET, OPTIONS, DELETE")
.allowedHeaders("*")
.exposedHeaders("Authorization", "Content-Type")
.allowCredentials(false).maxAge(3600);
}
}

仅仅这样做并不能解决问题,尽管使用 Tomcat 调试器我可以看到它被正确执行和添加。我有一个属性文件,这样我就可以更改允许的域,而无需重新编译应用程序,就像我之前在 4.1.x Spring 上使用自己的实现所做的那样。

因为我将这个应用程序作为 OAuth2 应用程序,所以我也实现了一个拦截器。

在我的 WebMvcConfigurerAdapter 实现中,我之前有一个拦截器,所以我试图将它添加到它:

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CORSInterceptor());
super.addInterceptors(registry);
}

它按如下方式加载我的 CORSInterceptor 实现:

package com.nando.api.filters;

import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

/**
*
* @author Nando
*
*/
@Component
public class CORSInterceptor extends HandlerInterceptorAdapter {

private Properties prop = new Properties();

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {

InputStream in = getClass().getResourceAsStream("/com/nando/config/cors.properties");
prop.load(in);
in.close();

String domains = prop.getProperty("allowed.origins");

Set<String> allowedOrigins = new HashSet<String>(Arrays.asList(domains
.split(",")));

String originHeader = "";
originHeader = request.getHeader("Origin");

if (null != originHeader) {
for (String s : allowedOrigins) {
if (originHeader.contains(s)) {
if (!response.getHeaderNames().contains("Access-Control-Allow-Origin")) {
response.addHeader("Access-Control-Allow-Origin",
originHeader);
}
if (!response.getHeaderNames().contains("Access-Control-Allow-Methods")) {
response.addHeader("Access-Control-Allow-Methods",
"OPTIONS, GET, POST, PUT, DELETE, HEAD");
}
if (!response.getHeaderNames().contains("Access-Control-Allow-Credentials")) {
response.addHeader("Access-Control-Allow-Credentials", "true");
}
if (!response.getHeaderNames().contains("Access-Control-Allow-Headers")) {
response.addHeader("Access-Control-Allow-Headers",
"Authorization, Origin, Content-Type, x-Requested-with, Accept, Accept-Enconding, X-CSRF-Token");
}
if (!response.getHeaderNames().contains("Access-Control-Max-Age")) {
response.addHeader("Access-Control-Max-Age", "1800");
}
return true;
}
}
}
return true;
}
}

而且仍然不会有所作为。

我不想将 CORS 过滤器添加到 Tomcat,因为它不允许我在属性文件上设置域,这迫使我在每次添加或删除域时都编辑 Tomcat 实例配置。

看来我在这里遇到了一个难题。

此外,我认为按照 Spring 4.2 的说明设置 CORS 会更容易,但事实并非如此。

有人能帮忙吗?

谢谢,

卡洛斯。

最佳答案

如果你想使用 Spring CORS 支持,我认为你应该:

  • allowedMethods("PUT, POST, GET, OPTIONS, DELETE") 更改为 allowedMethods("PUT", "POST", "GET", "OPTIONS", "DELETE")(这是一个可变参数)
  • 去掉allowedHeaders("*"),它已经是默认值了
  • 删除您的CORSInterceptor
  • 移除 Tomcat CORS 过滤器
  • 检查它是否在没有 Spring Security 的情况下工作
  • 按照 Brian 的建议,给我们更多有关 HTTP 请求/响应的详细信息

作为替代方案,请注意 Spring Framework 4.2 GA 还提供了一个 CorsFilter可以与 UrlBasedCorsConfigurationSource 结合使用的实现提供全局 CORS 支持。

如果您使用的是 Spring Boot(它支持 Filter beans),在您的一个 @Configuration 注释类中可能是这样的:

@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.addExposedHeader("Authorization");
config.addExposedHeader("Content-Type");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}

关于java - Spring 4.2.0.RC2 和 Tomcat 8.0.23 的 CORS 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com