我有两个服务器(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.有人知道哪里出了问题吗?
发布于 2013-01-30 02:09:38
您遇到的问题是您正在尝试执行跨站点脚本。您在http://MyIP:8080上访问了该页面,因此浏览器阻止您访问该域以外的资源。这是浏览器特有的,基于浏览器的解决方案将是完全不同的(您可以在Chrome中全局禁用安全性,并在IE中逐个站点禁用安全性)。
如果您将页面作为http://localhost:8080加载,那么它应该允许您访问查询。或者,您可以实现一个代理,它将转发请求。
发布于 2015-03-21 23:24:18
最新的resteasy (3.0.9-Final)包括一个实用程序类org.jboss.resteasy.plugins.interceptors.CorsFilter。
您可以将CorsFilter对象添加到应用程序的单例对象集中,也可以直接将其添加到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;
}
}发布于 2013-12-26 21:20:16
听起来这个问题跟https://issues.jboss.org/browse/RESTEASY-878有关。您可能无法使用MessageBodyWriterInterceptor捕获CORS印前检查请求。请尝试使用servlet过滤器(@WebFilter)。
https://stackoverflow.com/questions/14589031
复制相似问题