gpt4 book ai didi

java - 使用 Content-Type :application/json 时,对 Activiti REST API 的 POST 请求会导致 CORS 问题

转载 作者:行者123 更新时间:2023-12-02 04:41:30 26 4
gpt4 key购买 nike

我正在使用 AngularJS 来消耗 Activit REST 资源。所有 GET 操作都按预期工作,但是当我尝试使用 Content-Type:application/json POST 到/runtime/process-instances 时,它在预检时失败。如您所见,响应 header 中没有“Access-Control-Allow-Origin”。

2015-05-08 17_29_07-activiti rest caller net

例如,当我将 Content-Type 更改为 application/x-www-form-urlencoded;charset=utf-8 时,“Access-Control-Allow-Origin”出现在响应 header 中,但据我们所知,我的 POST 无法正常工作,因为 API 期望它具有 content-type:application/json

2015-05-08 17_39_01-activiti rest caller net

如何解决这个问题?

感谢任何意见!

最佳答案

自 Activiti 5.17 起,Activiti 使用 Spring Security 来保护 REST-API。仅当您发送在 Tomcat CORS 配置中的 allowed-headers 字段中传播的 header 时,Tomcat CORS 过滤器才会被触发。我没有成功地对每个请求触发 CORS 过滤器。因此,我这样做了:

  1. 编写您自己的 CORS 过滤器

    公共(public)类 CorsFilter 扩展了 OncePerRequestFilter {

        @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    throws ServletException, IOException {

    response.setHeader("Access-Control-Allow-Origin", "*");
    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    response.setHeader("Access-Control-Allow-Headers", "accept, x-requested-with, Content-Type, Accept-Language, Accept-Encoding ,Origin, Access-Control-Request-Method ,Access-Control-Request-Headers, Last-Modified, Cookie, Referer");
    response.setHeader("Access-Control-Expose-Headers", "Access-Control-Allow-Origin,Accept-Ranges,Content-Encoding,Content-Length,Content-Range");
    response.setHeader("Access-Control-Max-Age", "100");
    }

    filterChain.doFilter(request, response);
    }

    }
  2. 在 activiti-rest-webapp2 的 Spring 配置中添加过滤器:

http.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class)

.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()

选项请求需要在没有 Spring 身份验证的情况下传递,否则 CORS 预检请求将失败。

如果您这样做,Activiti 将在您发出的每个请求上添加 Access-Control-Allow-Origin。

最诚挚的问候本

关于java - 使用 Content-Type :application/json 时,对 Activiti REST API 的 POST 请求会导致 CORS 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132867/

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