当前位置: 首页 > 知识库问答 >
问题:

CORS响应过滤器未调用Resteasy / JAX-RS 2.0

虞祯
2023-03-14

我正在尝试实现一个CORS响应过滤器,以允许来自我的JavaScript前端的跨域引用。我使用的是Resteasy附带的< code > wildly 10.0 . final ,如果我理解正确的话,它是< code>JAX-RS 2.0的补充。

EDIT:将@Provider添加到CorsResponseFilter中,并作为一个单独的元素添加到RestServiceConfig中。

我需要做什么来调用我的CorsResponseFilter?

PS。看了这些帖子,但对解决问题没有帮助。

container request filter container response filter不会被调用

资源配置和应用程序

核心响应过滤器.java

@Provider
public class CorsResponseFilter implements ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

    MultivaluedMap<String, Object> headers = responseContext.getHeaders();
    headers.add("Access-Control-Allow-Origin", "*");
    //headers.add("Access-Control-Allow-Origin", "http://podcastpedia.org"); //allows CORS requests only coming from podcastpedia.org       
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");        
    headers.add("Access-Control-Max-Age", "1209600");
}

}

RestServiceConfig.java

public class RestServiceConfig extends Application {

    private final Set<Object> singletons = new HashSet<>();

    public RestServiceConfig() {
        singletons.add(new CorsResponseFilter());  
        singletons.add(new ApplicationService());
        singletons.add(new TweetObsService());
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

web.xml

...
<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    </listener-class>
</listener>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.mycorp.myapp.service.RestServiceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>org.clearbyte.obs.service.CorsResponseFilter</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/service/*</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/service</param-value>
</context-param>

...

Wildfly日志控制台

13:56:01,672 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.clearbyte.obs.service.RestServiceConfig
13:56:01,672 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] RESTEASY002200: Adding class resource org.clearbyte.obs.service.TweetObsService from Application class org.clearbyte.obs.service.RestServiceConfig
13:56:01,672 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] RESTEASY002200: Adding class resource org.clearbyte.obs.service.ApplicationService from Application class org.clearbyte.obs.service.RestServiceConfig

共有3个答案

糜单弓
2023-03-14

有些浏览器(即:Chrome)在发出请求之前会发送一个选项请求。由于您显式指定了“GET”“PUT”“POST”“DELETE”,因此“OPTION”调用不会获取标头信息:)

将选项添加到列表中应该可以解决问题

长孙弘壮
2023-03-14

我会尝试将其声明为标准过滤器,而不是 servlet 调度程序的参数:

<filter>
    <filter-name>CorsHeadersFilter</filter-name> 
    <filter-class>org.clearbyte.obs.service.CorsResponseFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CorsHeadersFilter</filter-name> 
    <url-pattern>/service/*</url-pattern> 
</filter-mapping>
微生旻
2023-03-14

因此,我从头开始了一个新项目,以消除错误源。感谢您使用@Provider并添加OPTIONS。另外,我从web.xml中删除了所有配置REST。

@提供程序对于筛选器工作至关重要

ServiceCorsFilter.java

@Provider
public class ServiceCorsFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE");
        responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type");                       
    }    
}

@ApplicationPath使web.xml配置过时

ServiceConfig.java

    @ApplicationPath("service")
public class ServiceConfig extends Application {

    private Set<Object> singletons = new HashSet<>();

    public ServiceConfig() {
        singletons.add(new UserServiceV1());
        singletons.add(new ServiceCorsFilter());
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }

}

这是网络中剩下的内容.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <display-name>MyApp</display-name>
    <!-- No REST related config due the the @Provider and inheritance of Application-->
</web-app>
 类似资料:
  • 问题内容: 我创建了一个RestEASY拦截器,以允许我在Web服务调用完成后在HTTP响应上设置标头值。我的代码看起来像这样… 但是,当我调用服务时,永远不会调用拦截器。我看到webservice调用成功完成,但是拦截器中的任何代码都没有执行过。除了注册拦截器,我还需要做些其他事情吗?是否必须在其他任何地方声明?是否需要包含任何特殊的web.xml参数? 问题答案: 您必须在web.xml的re

  • Cors过滤器的配置概述。 { "name": "cors", "config": {} } 返回 上一级

  • 这是一个基于路由或虚拟主机的处理跨源共享资源请求(Cross-Origin Resource Sharing)的过滤器设置。标题相关的含义,请参阅下面的连接。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS https://www.w3.org/TR/cors/ v1 API 参考 v2 API 参考 返回

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

  • 更新:我尝试将过滤器实现为OncePerRequestFilter,但仍然不起作用。有人能在这里进一步帮助我吗? 更新2:也试过这个,http://software.dzhuvinov.com/cors-filter-installation.html,运气不好 更新#3:这是我在控制台中的输出,我可以看到响应没有添加任何标题: register.html

  • 问题内容: 我们添加到我们现有的项目中。 从这一刻起,我们从服务器收到401 错误。 这是因为没有标头附加到响应。为了解决这个问题,我们Filter在退出过滤器之前的链中添加了我们自己的过滤器,但是该过滤器不适用于我们的请求。 我们的错误: XMLHttpRequest无法加载。所请求的资源上不存在“ Access-Control-Allow-Origin”标头。http://localhost: