JAX-RS在Glassfish 4上启用CORS(访问控制允许来源)

JAX-RS在Glassfish 4上启用CORS(访问控制允许来源),glassfish,http-headers,jax-rs,cors,Glassfish,Http Headers,Jax Rs,Cors,我在JavaEE7中工作,JAX-RS2.0GlassFish4是我的服务器。 我想在CORS上工作,使Ajax请求能够提交到我的域之外。 我知道我需要让我的服务器启用它。我用PHP做的。如以下代码所示: <?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Headers: Authorization"); 但似乎所有这些都被Glassfish4服务器提供的“防火墙安全”阻止了。 以

我在JavaEE7中工作,JAX-RS2.0GlassFish4是我的服务器。 我想在CORS上工作,使Ajax请求能够提交到我的域之外。 我知道我需要让我的服务器启用它。我用PHP做的。如以下代码所示:

 <?php header("Access-Control-Allow-Origin: *");
 header("Access-Control-Allow-Headers: Authorization");
但似乎所有这些都被Glassfish4服务器提供的“防火墙安全”阻止了。 以下是我的简单javascript代码:

<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://127.0.0.1:8080/CV/api/v2/posts");
xhr.setRequestHeader('Authorization', 'a');
xhr.send();
</script>
我知道Glassfish3不支持CORS,并且(“)他们说他们将用JEE7修复它。 这就是整个故事。。。 那么,我如何使用Glassfish服务器和JAX-RS2使用这个JEE7来执行CORS呢。 提前感谢。

使用not,因为您希望将这些标题添加到响应中,而不是请求中。例如:

@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class AccessControlResponseFilter implements ContainerResponseFilter {

    @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", "Authorization, Origin, X-Requested-With, Content-Type");
        headers.add("Access-Control-Expose-Headers", "Location, Content-Disposition");
        headers.add("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS");
    }
}
@Provider
@优先级(Priorities.HEADER\u DECORATOR)
公共类AccessControlResponseFilter实现ContainerResponseFilter{
@凌驾
公共无效筛选器(ContainerRequestContext requestContext、ContainerResponseContext responseContext responseContext)引发IOException{
最终多值映射头=responseContext.getHeaders();
headers.add(“访问控制允许原点”、“*”);
headers.add(“访问控制允许头”、“授权、来源、X-request-With、内容类型”);
添加(“访问控制公开标题”、“位置、内容处置”);
添加(“访问控制允许方法”、“POST、PUT、GET、DELETE、HEAD、OPTIONS”);
}
}

您必须使用2*过滤器*第一个原因是Chrome和其他浏览器出于安全目的修改标题,第二个原因是添加标题以响应。因此,请使用ContainerResponseFilterContainerRequestFilter。这很好。祝我好运!

谢谢您的反馈。在我的情况下,它不起作用…我使用了调试,它已经更改为选项方法。我无法获取任何标题,因为选项没有标题…我认为有防火墙阻止我获取Ajax请求的POST请求,您只需添加此行标题。添加(“访问控制允许来源”、“*”);我一直在研究这个问题,我发现了太多不同的回答,我完全搞糊涂了。从上面列出的答案来看,你是说
公共类httpmethodoverridenabler实现的
将同时实现ContainerResponseFilter和ContainerRequestFilter吗?
@Provider
@PreMatching
 public class HttpMethodOverrideEnabler implements ContainerRequestFilter {
 @Override
 public void filter(ContainerRequestContext containerRequestContext) throws IOException {
    containerRequestContext.setMethod("POST");

    containerRequestContext.getHeaders().add("Access-Control-Allow-Origin", "*");
    containerRequestContext.getHeaders().add("Access-Control-Allow-Headers","Authorization");
    containerRequestContext.getHeaders().add("Access-Control-Allow-Headers","Authorization");

    String override = containerRequestContext.getHeaders().getFirst( "X-HTTP-Method-Override");
    if (override != null) {
        containerRequestContext.setMethod(override);
    }
}
@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class AccessControlResponseFilter implements ContainerResponseFilter {

    @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", "Authorization, Origin, X-Requested-With, Content-Type");
        headers.add("Access-Control-Expose-Headers", "Location, Content-Disposition");
        headers.add("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS");
    }
}