【问题标题】:JAX-RS enabling CORS (Access-Control-Allow-Origin) on Glassfish 4在 Glassfish 4 上启用 CORS(访问控制允许来源)的 JAX-RS
【发布时间】:2013-11-25 16:00:25
【问题描述】:

我在 JAVA EE7 中工作,JAX-RS 2.0 Glassfish 4 是我的服务器。 我想在 CORS 上工作以启用来自我的域的 Ajax 请求。 我知道我需要让我的服务器启用它。我在 PHP 中做到了。像下面的代码:

 <?php header("Access-Control-Allow-Origin: *");
 header("Access-Control-Allow-Headers: Authorization");

但是当我尝试做同样的事情时,我总是会收到这样的错误消息 "this is a screenshot"。 所以我尝试通过多种方式修改服务器 http 响应...

这是我的代码,服务器端,我使用了文件管理器/提供程序:

@Provider
@CORSBinding 
public class Filter implements  ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext request) throws IOException {
    request.getHeaders().add("Access-Control-Allow-Origin", "*");
    request.getHeaders().add("Access-Control-Allow-Headers", "Authorization"); 
    if (request.getMethod().equals("OPTIONS")) {
        System.out.println("OPTIONS is requested!!!!!!!!!!!!!");
    }
    if (request.getMethod().equals("GET")) {
        System.out.println("GET is requested!!!!!!!!!!!!!");
    }
    if (request.getMethod().equals("POST")) {
        System.out.println("POST is requested!!!!!!!!!!!!!");
    }
    if (request.getMethod().equals("DELETE")) {
        System.out.println("DELETE is requested!!!!!!!!!!!!!");
    }
    if (request.getMethod().equals("PUT")) {
        System.out.println("PUT is requested!!!!!!!!!!!!!");
    }       
}
}

但似乎一切都被 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>

我什至使用 @Prematching 注释添加了另一个过滤器来更新从 OPTIONS TO POST 的请求......但我总是丢失我在其中发送的标题(我的意思是在 POST 请求中)。

@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);
    }
}

我知道 Glassfish3 不支持 CORS,并且 ("https://java.net/jira/browse/GLASSFISH-16049) 他们说他们会用 JEE7 修复它。 这就是整个故事... 那么如何使用 Glassfish 服务器和 JAX-RS2 对这个 JEE7 进行 CORS。 提前致谢。

【问题讨论】:

    标签: glassfish http-headers jax-rs cors


    【解决方案1】:

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

    @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");
        }
    }
    

    【讨论】:

    • 感谢您的反馈。在我的情况下它不起作用......我使用了 Debug ,它已经更改为 OPTIONS 方法。我不能接受任何标题,因为 OPTIONS 没有标题......我认为有一个防火墙阻止我收到 POST 请求
    【解决方案2】:

    您必须使用 2 *filters* 第一个是因为 Chrome 和其他浏览器出于安全目的修改了 headers,第二个是添加 headers 以响应.所以使用 ContainerResponseFilterContainerRequestFilter。对我来说效果很好祝你好运!

    【讨论】:

    • 对于您的 Ajax 请求,您只需添加这一行 headers.add("Access-Control-Allow-Origin", "*");
    • 我一直在研究这个,我发现了很多不同的反应,我完全糊涂了。从上面列出的答案中,您是说public class HttpMethodOverrideEnabler implements 将同时实现 ContainerResponseFilter 和 ContainerRequestFilter?
    猜你喜欢
    • 2017-01-16
    • 2016-12-09
    • 2019-02-09
    • 2016-06-02
    • 2014-08-06
    • 2021-09-07
    • 2016-06-27
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多