当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Data Rest+CORS不能正确启用选项/删除

宋飞掣
2023-03-14

我有一个非常简单的例子,我不能去工作。

我有我的域来建模我的数据库和我的存储库。

public interface MyTestRepository extends CrudRepository<MyTest, Integer> {
}
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedMethods("*")
        .allowedHeaders("*")
        .allowCredentials(true).maxAge(3600);
}
@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
}

Spring数据Rest和Cors

并尝试了下面的代码,但没有成功。

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", config);
    // return new CorsFilter(source);
    final FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
}

我添加了一个catch all来测试,它应该允许所有CORS wise通过,但是我仍然得到No'Access-Control-Allow-Origin',即使我有“*”。

最终找到了精确的解。我不确定我所拥有的和这种方法之间的区别,但这似乎是有效的。

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Note this is a very simple CORS filter that is wide open.
 * This would need to be locked down.
 * Source: https://stackoverflow.com/questions/39565438/no-access-control-allow-origin-error-with-spring-restful-hosted-in-pivotal-web
 */
@Component
public class CORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

共有1个答案

燕凯旋
2023-03-14

这就是我使用的许可所有CORS servlet过滤器:

public class PermissiveCORSFilter implements Filter {

    private static final Logger LOGGER = LoggerFactory.getLogger(PermissiveCORSFilter.class);
    private static final Pattern PATTERN = Pattern.compile("^[a-zA-Z0-9 ,-_]*$");

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        String origin;
        String credentialFlag;
        if (request.getHeader("Origin") == null) {
            origin = "*";
            credentialFlag = "false";
         } else {
            origin = request.getHeader("Origin");
            credentialFlag = "true";
         }

        // need to do origin.toString() to avoid findbugs error about response splitting        
        response.addHeader("Access-Control-Allow-Origin", origin.toString());
        response.setHeader("Access-Control-Allow-Credentials", credentialFlag);
        if ("OPTIONS".equals(request.getMethod())) {
            LOGGER.info("Received OPTIONS request from origin:" + request.getHeader("Origin"));
            response.setHeader("Access-Control-Allow-Methods", "GET,POST,HEAD,OPTIONS,PUT,DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            String headers = StringUtils.trimToEmpty(request.getHeader("Access-Control-Request-Headers"));
            if (!PATTERN.matcher(headers).matches()) {
                throw new ServletException("Invalid value provided for 'Access-Control-Request-Headers' header");
            }
            response.setHeader("Access-Control-Allow-Headers", headers); // allow any headers
        }
        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {
        // Do nothing
    }

    @Override
    public void destroy() {
        // Do nothing
    }
 类似资料:
  • 每次对服务进行PUT Ajax调用时,它都会返回以下错误: 用于处理所有选项请求控制器:

  • 我需要在spring boot data rest api中启用全局CORS,以防止在从浏览器调用api时出现以下错误:http://localhost:8090/posts?user-id=1。请求的资源上没有“访问-控制-允许-来源”标头。因此,不允许访问源“http://localhost”。“ 我可以在a浏览器中键入url并接收该资源的正确get响应,但我不能从网页中的ajax调用中发出相

  • 所以Eclipse正在工作windows安装了一些更新并重新启动了我的计算机,然后突然eclipse不工作了。我已经用它做了一些尝试,我的java类路径是正确的,我相信但是eclipse仍然只会显示启动屏幕,然后立即关闭。 除非我使用-debug-consoleLog标记运行它,否则它似乎工作正常。你知道怎么解决这个问题吗? 编辑: 所以当我用调试控制台日志标签启动它时,日志是这样写的 这是我的日

  • 我正在尝试以伪分布式模式安装Hadoop2.2.0。当我试图启动datanode服务时,它显示了以下错误,有人能告诉我如何解决这个问题吗?

  • 我正在做一个更大的项目(和很多同学一起),我试图在TableView中显示一个arrayList(我们在项目中反复使用的类型,所以我不想仅仅为了我的小问题而将所有这些都改为ObservableLists)。 初始化父根和tableView时,ArrayList主题被转换为ObservableList,并加载到tableView中。 我真的很想从理论上理解,为什么改变成绩对tableView有效,但

  • 我在Stackoverflow上找不到解决方案后解决了这个问题,所以我在这里分享我的问题和答案中的解决方案。 在我的中启用跨域策略后。NET核心Web Api应用程序和AddCors,它仍然无法在浏览器上工作。这是因为包括Chrome和Firefox在内的浏览器首先会发送一个选项请求,而我的应用程序只会响应204个没有内容的请求。