簡體   English   中英

JAX-RS - 創建擴展ContainerRequestFilter的過濾器

[英]JAX-RS - Creating filter extending ContainerRequestFilter

我的TomEE Plume 7.0.2存在問題。

我用這種方式創建了一個過濾器:

package com.gfp.rest.providers;

import java.io.IOException;

import javax.annotation.Priority;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

@PreMatching
@Provider
@Priority(value = 1)
public class AuthenticationFilter implements ContainerRequestFilter
{
    public AuthenticationFilter()
    {
        System.out.println("AuthenticationFilter.AuthenticationFilter()");
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        System.out.println("AuthenticationFilter.filter()");
        String token = requestContext.getHeaderString("token");

        ResponseBuilder responseBuilder = null;
        Response response = null;

        // check if token is empty
        if (token.isEmpty()) {
            responseBuilder = Response.serverError();
            response = responseBuilder.status(Status.UNAUTHORIZED).build();
            requestContext.abortWith(response);
        }
    }
}

這是我的Rest應用程序:

    package com.gfp.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("api/v1")
public class RestApplication extends Application
{
}

問題是:過濾器似乎沒有被調用。 我已閱讀了大量文檔和許多其他帖子,我找不到任何解決方案。 有什么特別的東西我錯過了嗎?

非常感謝 !

嘗試這個

package com.gfp.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("api/v1")
public class RestApplication extends Application
{
public Set<Class<?>> getClasses() {
        return getRestClasses();
    }

    private Set<Class<?>> getRestClasses() {
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();        
        resources.add(AuthenticationFilter.class);
        return resources;    
    }
}

此外,您可能需要使用org.glassfish.jersey.servlet.ServletContainer作為web.xml中的servlet容器,用於Jersey 2.x.

它取決於你的配置(我認為是openejb-jar.xml和系統屬性),因為它應該開箱即用( https://github.com/apache/tomee/blob/41cb392c6e3dc63d6792eae88e90c33743255212/server/openejb-cxf-rs/src /test/java/org/apache/openejb/server/cxf/rs/CDIProviderContainerRequestFilterTest.java不做任何事情)

另一種方法是在Rahul的答案中注冊類中的過濾器(但是請不要做任何與球衣相關的事情,因為TomEE不使用球衣它會失敗而只是添加一團糟)或者只是在openejb-jar.xml中配置它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM