加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – jersey 2.2:ContainerResponseFilter和ContainerReques

发布时间:2020-12-14 23:22:55 所属栏目:Java 来源:网络整理
导读:在Jersey网站上的入门指南之后: 我执行了以下构建命令: $mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false -DgroupId=com.example -DartifactId=
在Jersey网站上的入门指南之后:

我执行了以下构建命令:

$mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false 
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example 
-DarchetypeVersion=2.2

然后我按照教程进行操作

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783

添加自定义ContainerResponseFilter:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
static @interface CORSBinding {}

@Provider
@Priority(Priorities.HEADER_DECORATOR)
@CORSBinding
static class CrossDomainFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext creq,ContainerResponseContext cres) {
        Logger.getLogger("com.example").log( Level.INFO,"before: {0}",cres.getHeaders());
        cres.getHeaders().add("Access-Control-Allow-Origin","*");
        cres.getHeaders().add("Access-Control-Allow-Headers","origin,content-type,accept,authorization");
        cres.getHeaders().add("Access-Control-Allow-Credentials","true");
        cres.getHeaders().add("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS,HEAD");
        cres.getHeaders().add("Access-Control-Max-Age","1209600");
        Logger.getLogger("com.example").log( Level.INFO,"after: {0}",cres.getHeaders());
    }
}

@Provider
static class MyResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext) throws IOException {
        System.out.println("MyResponseFilter.postFilter() enter");
        responseContext.setEntity(
                responseContext.getEntity() + ":" + getClass().getSimpleName(),null,MediaType.TEXT_PLAIN_TYPE);
        System.out.println("MyResponseFilter.postFilter() exit");
    }
}

...
@GET
@Produces(MediaType.TEXT_PLAIN)
@CORSBinding
public String helloWorld() {
    return "hello world";
}

我尝试使用命名绑定和动态绑定注册此过滤器,没有任何作用.

为了便于重现,我还尝试了官方资源的一个例子:

https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping

同样的问题:自定义过滤器不会被执行.

这是一个灰熊问题吗?

解决方法

事实证明,您必须手动注册自定义类 – 如:
rc.register(com.dummy.mypackage.CORSResponseFilter.class);

完整示例:

/**
 * Main class.
 *
 */
public class Main {
    // Base URI the Grizzly HTTP server will listen on
    public static final String BASE_URI = "http://192.168.1.34:8080/myapp/";

    /**
     * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
     * @return Grizzly HTTP server.
     */
    public static HttpServer startServer() {
        // create a resource config that scans for JAX-RS resources and in com.example package
        final ResourceConfig rc = new ResourceConfig().packages("com.dummy.mypackage");

        //NEW: register custom ResponseFilter
        rc.register(com.dummy.mypackage.CORSResponseFilter.class);

        // Register Jackson JSON
        rc.packages("org.glassfish.jersey.examples.jackson").register(JacksonFeature.class);

        // create and start a new instance of grizzly http server
        // exposing the Jersey application at BASE_URI
        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI),rc);
    }
    ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读