首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问-控制-允许-源站不允许源站http://127.0.0.1:8888

访问-控制-允许-源站不允许源站http://127.0.0.1:8888
EN

Stack Overflow用户
提问于 2013-01-10 13:42:50
回答 2查看 6K关注 0票数 1

我在尝试使用GWT客户端访问REST web服务时遇到了这个问题。我检查了chrome页面,然后从控制台得到以下错误

代码语言:javascript
复制
XMLHttpRequest cannot load http://localhost:8080/RestWeb/webresources/generic/get. Origin http://127.0.0.1:8888 is not allowed by Access-Control-Allow-Origin.

以下是我的客户端代码

代码语言:javascript
复制
public void onModuleLoad() {

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
            "http://localhost:8080/RestWeb/webresources/generic/get");

    builder.setCallback(new RequestCallback() {

        @Override
        public void onResponseReceived(Request request, Response response) {

            Window.alert("onResponseReceived");

        }

        @Override
        public void onError(Request request, Throwable exception) {

        }
    });
    builder.setHeader("Content-Type",
            "text/plain,application/json,text/xml");

    builder.setHeader("Access-Control-Allow-Methods",
            "PUT, GET, POST, DELETE, OPTIONS");
    builder.setHeader("Access-Control-Allow-Headers", "Content-Type");
    builder.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8888");
try {
            builder.send();
        } catch (RequestException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我的服务器端代码是:

代码语言:javascript
复制
@Path("generic")
@WebService
public class GenericResource {

@Context
private UriInfo context;
@Context
private HttpServletResponse response;
private String content = "content";

/**
 * Creates a new instance of GenericResource
 */
public GenericResource() {
}

@GET

@Path("/get")
@Produces("application/json,text/plain")
public String getXml() {
    System.out.println("GET");
    //response.addHeader(content, content);

    return this.content + " from get method";

}
}

我尝试了不同的方式来得到答案。请帮帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 14:28:31

您需要更改服务器代码以支持CORS。

一个选项是过滤器:

代码语言:javascript
复制
public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            // CORS "pre-flight" request
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
            response.addHeader("Access-Control-Max-Age", "1800");//30 min
        }
        filterChain.doFilter(request, response);
    }
}

web.xml还需要添加以下内容:

代码语言:javascript
复制
  <filter>
    <filter-name>cors</filter-name>
    <filter-class>com.xxx.CorsFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
票数 2
EN

Stack Overflow用户

发布于 2013-04-07 04:39:54

因为这是一个古老的问题,如果一个人今天面临着类似的问题--他或她可能想要考虑使用一个很好的"CORS过滤器“,以完全透明的方式为你处理所有的CORS内容。这是link

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14251529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档