【问题标题】:Enable CORS settings in Payara (or Glassfish) server在 Payara(或 Glassfish)服务器中启用 CORS 设置
【发布时间】:2019-07-08 19:10:44
【问题描述】:

有谁知道如何直接在 Payara 服务器(或 glassfish)中为某些域启用 CORS?

我正在使用 Payara 服务器 4.1.1.171.1。

我有一个在 localhost:3000 上运行的应用程序需要与 Payara 服务器通信,但我不断收到 CORS 错误。

我发现的大多数链接只是将域(即本地主机)添加到响应标头中,如下所示:

response.addHeader("Access-Control-Allow-Origin", "localhost");

我已经在我的 java 代码中做到了,它可以工作。但我想知道如何直接在服务器中更新 Payara(或 glassfish)来做到这一点。因为我看到人们提出了这样做的建议(即更新服务器配置文件以允许某些域的 CORS)。这样java代码就不必在上面专门添加头内容了。

但这些建议中的示例服务器不是 Glassfish 也不是 Payara。

即使是这个 CORS 链接 https://enable-cors.org/server.html 也列出了 20 多个关于如何启用 CORS 的服务器/平台,但没有一个是 Payara 或 Glassfish。

有人知道怎么做吗?

提前致谢!

【问题讨论】:

    标签: cors glassfish payara


    【解决方案1】:

    您需要为每个调用创建一个拦截器,您必须向其中添加更多标头。在您需要的某些条件下。请看下面的代码:

    import javax.ws.rs.HttpMethod;
    import javax.ws.rs.container.ContainerRequestContext;
    import javax.ws.rs.container.ContainerResponseContext;
    import javax.ws.rs.container.ContainerResponseFilter;
    import javax.ws.rs.container.PreMatching;
    import javax.ws.rs.core.MultivaluedMap;
    import javax.ws.rs.ext.Provider;
    
    
    @Provider
    @PreMatching
    public class CorsResponseFilter implements ContainerResponseFilter {
    
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
                String origin = requestContext.getHeaderString("Origin");
                if ((origin != null) 
                        && origin.startsWith("http://localhost:4200") || origin.startsWith("http://localhost:8080"))) {
                    allowExceptionCors(requestContext, responseContext, origin);
                } 
        }
    
        private void allowExceptionCors(ContainerRequestContext requestContext, ContainerResponseContext responseContext, String origin) {
            String methodHeader = requestContext.getHeaderString("Access-Control-Request-Method");
            String requestHeaders = requestContext.getHeaderString("Access-Control-Request-Headers");
    
            MultivaluedMap<String, Object> headers = responseContext.getHeaders();
            headers.putSingle("Access-Control-Allow-Origin", origin);
            headers.putSingle("Access-Control-Allow-Credentials", "true");
            headers.putSingle("Access-Control-Allow-Methods", methodHeader);
            headers.putSingle("Access-Control-Allow-Headers", "x-requested-with," + (requestHeaders == null ? "" : requestHeaders));
        }
    }
    

    【讨论】:

      【解决方案2】:

      对于更开放 cors 过滤,您可以使用以下内容:

      import java.io.IOException;
      import java.util.List;
      import javax.ws.rs.container.ContainerRequestContext;
      import javax.ws.rs.container.ContainerResponseContext;
      import javax.ws.rs.container.ContainerResponseFilter;
      import javax.ws.rs.core.MultivaluedMap;
      import javax.ws.rs.ext.Provider;
      
      
      @Provider
      public class CorsResponseFilter implements ContainerResponseFilter {
      
          public static final String ALLOWED_METHODS = "GET, POST, PUT, DELETE, OPTIONS, HEAD";
          public final static int MAX_AGE = 42 * 60 * 60;
          public final static String DEFAULT_ALLOWED_HEADERS = "origin,accept,content-type";
          public final static String DEFAULT_EXPOSED_HEADERS = "location,info";
      
          @Override
          public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
              final MultivaluedMap<String, Object> headers = responseContext.getHeaders();
              headers.add("Access-Control-Allow-Origin", "*");
              headers.add("Access-Control-Allow-Headers", getRequestedAllowedHeaders(requestContext));
              headers.add("Access-Control-Expose-Headers", getRequestedExposedHeaders(requestContext));
              headers.add("Access-Control-Allow-Credentials", "true");
              headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
              headers.add("Access-Control-Max-Age", MAX_AGE);
              headers.add("x-responded-by", "cors-response-filter");
          }
      
          String getRequestedAllowedHeaders(ContainerRequestContext responseContext) {
              List<String> headers = responseContext.getHeaders().get("Access-Control-Allow-Headers");
              return createHeaderList(headers, DEFAULT_ALLOWED_HEADERS);
          }
      
          String getRequestedExposedHeaders(ContainerRequestContext responseContext) {
              List<String> headers = responseContext.getHeaders().get("Access-Control-Expose-Headers");
              return createHeaderList(headers, DEFAULT_EXPOSED_HEADERS);
          }
      
          String createHeaderList(List<String> headers, String defaultHeaders) {
              if (headers == null || headers.isEmpty()) {
                  return defaultHeaders;
              }
              StringBuilder retVal = new StringBuilder();
              for (int i = 0; i < headers.size(); i++) {
                  String header = (String) headers.get(i);
                  retVal.append(header);
                  retVal.append(',');
              }
              retVal.append(defaultHeaders);
              return retVal.toString();
          }
      
      }
      

      来自 Adam Bien 在GitHub 上的cors 项目

      【讨论】:

        猜你喜欢
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2020-12-10
        • 2019-06-27
        • 2012-06-19
        相关资源
        最近更新 更多