使用 JAX-RS/RESTEasy 实现 CORS 的 Ajax 请求

标签 ajax json jax-rs resteasy cors

我有两台服务器(Apache 和 JBoss AS7),我需要向客户端提供对所有 http 方法的访问。所有这些请求都必须通过ajax发送。
客户端代码示例:

$.ajax({
      type: "get",
      url: "http://localhost:9080/myproject/services/mobile/list",
      crossDomain: true,
      cache: false,
      dataType: "json",
      success: function(response) {
        console.log(response);
      },
      error: function (jqXHR, textStatus, errorThrown) {
        console.log(textStatus);
        console.log(jqXHR.responseText);
        console.log(errorThrown);
        }
    });

在 JBoss AS7 中,我使用 RESTEasy,按如下方式实现 CORS:
@Path("/mobile")
@Provider
@ServerInterceptor
public class GroupMobile implements MessageBodyWriterInterceptor {

@Inject
private GroupDAO groupDAO;

@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Group> getGroups() {
    return groupDAO.listAll();
}

@Override
public void write(MessageBodyWriterContext context) throws IOException,
        WebApplicationException {
    context.getHeaders().add("Access-Control-Allow-Origin", "*");
    context.proceed();
}

@OPTIONS
@Path("/{path:.*}")
public Response handleCORSRequest(
        @HeaderParam("Access-Control-Request-Method") final String requestMethod,
        @HeaderParam("Access-Control-Request-Headers") final String requestHeaders) {
    final ResponseBuilder retValue = Response.ok();

    if (requestHeaders != null)
        retValue.header("Access-Control-Allow-Headers", requestHeaders);

    if (requestMethod != null)
        retValue.header("Access-Control-Allow-Methods", requestMethod);

    retValue.header("Access-Control-Allow-Origin", "*");

    return retValue.build();
}
}

web.xml 和 beans.xml 是空文件。
当我访问 MyIP:8080 (Apache) 时,收到错误消息:
XMLHttpRequest cannot load http://localhost:9080/myproject/services/mobile/list?_=1359480354190. Origin http://MyIP:8080 is not allowed by Access-Control-Allow-Origin.

有人知道出了什么问题吗?

最佳答案

最新的 resteasy (3.0.9-Final) 包含一个实用程序类 org.jboss.resteasy.plugins.interceptors.CorsFilter .

您可以将 CorsFilter 对象添加到 Application 的单例中
对象集,或将其添加到 ResteasyDeployment 中的 ProviderFactory
直接地。

以下是示例应用程序类:

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;

import org.jboss.resteasy.plugins.interceptors.CorsFilter;


@ApplicationPath("/api")
public class RestApplication extends javax.ws.rs.core.Application {
    Set<Object> singletons;

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> clazzes = new HashSet<>();
        clazzes.add(VersionService.class);
        return clazzes;
    }

    @Override
    public Set<Object> getSingletons() {
        if (singletons == null) {
            CorsFilter corsFilter = new CorsFilter();
            corsFilter.getAllowedOrigins().add("*");

            singletons = new LinkedHashSet<Object>();
            singletons.add(corsFilter);
        }
        return singletons;
    }
}

关于使用 JAX-RS/RESTEasy 实现 CORS 的 Ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589031/

相关文章:

ajax - 如何在基于算法的无限滚动中防止重复

javascript - JQuery DataTables mRender 按钮 - 如何获得按钮点击

javascript - 从 ajax 发布时,nodejs express session 未定义

java - 将javax.ws.rs实体序列化为json

php - 从输入的邮政编码获取城市和州 javascript

python3 : can json be decoded as tuple?

javascript - JSON.stringify 在 IE10 中不起作用

java - Jersey 客户端内容配置中字段的某些顺序

java - 查询参数未映射

java - Jersey/web.xml/Servlet 路由问题