Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CORS的restful跨域请求选项_Rest_Xmlhttprequest_Http Options Method - Fatal编程技术网

使用CORS的restful跨域请求选项

使用CORS的restful跨域请求选项,rest,xmlhttprequest,http-options-method,Rest,Xmlhttprequest,Http Options Method,在客户端,我将Ajax.post(jquery1.5)与json一起使用。在服务器端,我使用rest resteasy-jaxrs-2.0.1.GA。我发现应该在服务器响应中添加两个标题,并使用了以下过滤器: public void doFilter( ServletRequest req, ServletResponse res, FilterChain filterChain) thr

在客户端,我将Ajax.post(jquery1.5)与json一起使用。在服务器端,我使用rest resteasy-jaxrs-2.0.1.GA。我发现应该在服务器响应中添加两个标题,并使用了以下过滤器:

public void doFilter(   ServletRequest req,
                        ServletResponse res,
                        FilterChain filterChain)
    throws IOException, ServletException {

    MyServletRequestWrapper httpReq    = new MyServletRequestWrapper((HttpServletRequest)req);
    HttpServletResponse    httpRes   = (HttpServletResponse)res;

    HttpSession session = httpReq.getSession();


    httpRes.addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
    httpRes.addHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");

   if (((HttpServletRequest) req).getMethod().equals("OPTIONS")){
        httpRes.addHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, OPTIONS, PUT, DELETE");
        httpRes.addHeader(ACCESS_CONTROL_ALLOW_HEADERS, "content-type, x-requested-with, x-requested-by");
   }

  filterChain.doFilter(httpReq, httpRes);

}
它可以很好地工作,因为上面添加了每个GET响应头。当我想使用POST请求时出现问题。当我使用Ajax.post时,首先服务器会收到选项请求,我会遇到以下错误:


执行选项[REST\u路径]失败
org.jboss.resteasy.spi.defaultoptions方法异常:找不到选项的资源方法,返回OK并带有Allow标头

为了解决上述错误,我尝试添加方法调用,其路径与POST相同([REST_path]),但带有@OPTION注释。在这种情况下,javac告诉我symbol:class选项无法找到,即使附加的jaxrs库中有OPTION.class


有什么好办法吗?我很感激任何线索。

< P>这个问题很古老,但作为其他类似问题的参考,最近我遇到了一个不错的“CORS过滤器”,你可能会考虑使用它。只需在web.xml中添加以下几行代码,它的效果就非常好

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>CORS</filter-name>
    <servlet-name>MyServletNameGoesHere</servlet-name>
</filter-mapping>

科尔斯
com.thetransactioncompany.cors.CORSFilter
科尔斯
MyServletNameGoesher
以及maven依赖关系:

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>1.5.1</version>
</dependency>

交易公司
cors过滤器
1.5.1

CORS过滤器可能正常。我想指出的是,正如您所写的“为了解决上述错误,我尝试使用与POST相同的路径([REST_path])添加方法调用,但使用@OPTION注释。在这种情况下,javac告诉我symbol:class OPTIONS找不到,”您在那里输入了一个打字错误而不是
@OPTIONS
,您编写的
@OPTION
没有
S
:)

tomcat中有一个内置的CORS过滤器。


克斯菲尔特
org.apache.catalina.filters.CorsFilter
克斯菲尔特
/*

当我试图使用Angular 2客户端调用我的服务时,RestEasy以HTTP状态500响应飞行前请求,并出现以下错误

RESTEASY003655:找不到选项的资源方法,返回OK 允许标题

我试过了,但我想提出一个简单的替代方案。如果您不想编写代码来处理每个端点的选项调用,该怎么办

我实现了一个简单的过滤器:

  • 将所需的CORS标头应用于响应
  • 使用OPTIONS方法调用端点时返回HTTP状态代码200。您告诉客户机其CORS飞行前请求已被接受 这是代码。如果您在查询“真实”端点时只想发回一个200,请随意优化过滤器

    @Provider 
    public class CorsFilter implements ContainerResponseFilter {  
    
      @Override
      public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*"); // If you want to be more restrictive it could be localhost:4200
        headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS"); // You can add HEAD, DELETE, TRACE, PATCH
        headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Accept-Language"); // You can add many more
    
        if (requestContext.getMethod().equals("OPTIONS"))
            responseContext.setStatus(200);
    }}
    
    @Provider
    公共类CorsFilter实现ContainerResponseFilter{
    @凌驾
    公共无效筛选器(ContainerRequestContext requestContext、ContainerResponseContext responseContext responseContext)引发IOException{
    多值映射头=responseContext.getHeaders();
    headers.add(“Access Control Allow Origin”,“*”;//如果您想更严格一些,可以使用localhost:4200
    headers.add(“访问控制允许方法”、“GET、PUT、POST、OPTIONS”);//您可以添加HEAD、DELETE、TRACE、PATCH
    headers.add(“访问控制允许头”、“内容类型、授权、接受、接受语言”);//您可以添加更多
    if(requestContext.getMethod().equals(“选项”))
    responseContext.setStatus(200);
    }}
    
    也一定要记得

    @Provider 
    public class CorsFilter implements ContainerResponseFilter {  
    
      @Override
      public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*"); // If you want to be more restrictive it could be localhost:4200
        headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS"); // You can add HEAD, DELETE, TRACE, PATCH
        headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Accept-Language"); // You can add many more
    
        if (requestContext.getMethod().equals("OPTIONS"))
            responseContext.setStatus(200);
    }}