2014-03-12 2 views
1

로직을 호출하기 전에 일부 http 헤더 정보를 확인하고 싶기 때문에 요청 필터를 설정하려고합니다. 불행히도 내 필터는 JBoss AS7.1.1에서 결코 호출되지 않습니다. 이미 RestEasy 문서 (RestEasy 문서)에 설명 된 것과 같이 RestEasy 구현 (모듈)을 3.0.6으로 업데이트하려고했습니다. 그것은 새로운 구현 zip 파일에 의해 제공되는 디렉토리를 대체해야한다고 말했고 그렇게했습니다. AS는 오류없이 시작되었지만 동작은 어떤 식 으로든 변경되지 않습니다. 각 요청은 차단되지 않습니다. 나는 더 복잡한 예에서이 코드를 추출하지만이 간단한 것은 작동하지 않습니다ContainerRequestFilter JBoss AS 7.1.1 RestEasy 3.0.6.Final

Filter.java

import java.io.IOException; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.ext.Provider; 

@Provider 
@Secured 
public class SecurityFilter implements ContainerRequestFilter { 

public void filter(ContainerRequestContext crc) throws IOException { 
    throw new IllegalStateException("Not in my house"); 
} 
} 

ItemsResource.java

import javax.ws.rs.Path; 
import javax.ws.rs.GET; 
import javax.ws.rs.Produces; 

@Path("/Items") 
public class ItemsResource { 

@GET 
@Produces("application/json") 
@Secured 
public String getJson() { 
    return "{\"id:\" \"1\"}"; 
} 
} 

ApplicationConfig.java을

@javax.ws.rs.ApplicationPath("rest") 
public class ApplicationConfig extends Application {  
} 

Secured.java

import javax.ws.rs.NameBinding; 

@NameBinding 
public @interface Secured {} 

내가 주석없이 인터셉터와 리소스를 사용하려고하면 아무것도 변경되지 않습니다. 나는 모든 요청을 가로 채기를 원하지만 비 의지를 기대한다. 나는 무엇을 해야할지 모르겠다. 아무도 조언을 좀 해줄 수 있을까요? 추가 할 물건을 추가합시다. 나는 Wildfly (JBoss 8.0.0 Final)와 같은 것을 시도했다. @NameBinding을 사용하고 커스텀 어노테이션을 적용하는 것은 또한 작동하지 않지만 어노테이션을 사용하지 않고 @Provider로 인터셉터에 주석을 달면 모든 요청이 가로 채게됩니다. Wildfly로 마이그레이션해야합니까?

+0

[가능한 특정 메서드를 통해 NameBinding RESTeasy] (http://stackoverflow.com/questions/15119309/match-filter-with-specific-method-through-namebinding-on-resteasy) –

답변

3

같은 문제가있었습니다. 3.0.8. 최종 RESTeasy 버전과 POM 종속성을 사용했습니다.
또한resteasy-jaxrs-3.0.7.Final zip 파일의 내용으로 JBOSS EAP (6.1)의 모듈을 업데이트.
유일한 diferece은 필터에 우리가 사용하는 것입니다 :

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.neology.rest.SecurityInterceptor</param-value> 
</context-param> 

:

@Provider @PreMatching 
@Precedence("SECURITY") 
public class SecurityInterceptor implements ContainerRequestFilter{ 
@Override 
public void filter(ContainerRequestContext arg0) throws IOException { 
    ... 
    } 
} 

을 또한 우리는 또한 의 web.xml에 공급자에게 직접를 등록해야와 우리가 붙어있는 다른 문제는 스프링 통합과 함께했습니다.
먼저 또한 보안 필터 체인을 확인하시기 바랍니다 * 리스너

<!-- RESTeasy Listener 1st --> 
<listener> 
    <listener-class> 
    org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 
    </listener-class> 
</listener> 
<!-- Spring Listener 2nd --> 
<listener> 
    <listener-class> 
    org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 


순서를 확인하는 것입니다. 나머지 서블릿 매핑을 /rest/*과 같이 설정 한 경우, Spring을 으로 설정해야합니다. REST 서비스를 필터링하지 마십시오.우리는 이것을 Spring XML 설정에서 사용합니다 :

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 
<mvc:resources mapping="/rest/**" location="/rest/" /> 

희망이 있습니다.

1

당신은 RESTEasy가 PreProcessInterceptor를 사용할 수 있습니다 /META-INF/services/javax.ws.rs.ext.Providers, javax 등

import org.jboss.resteasy.annotations.interception.ServerInterceptor; 
import org.jboss.resteasy.spi.interception.PreProcessInterceptor; 
import javax.ws.rs.ext.Provider; 

@Provider 
@ServerInterceptor 
public class SecurityInterceptor implements PreProcessInterceptor { 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException { 
     if (/* Check if a user is currently authenticated */) { 
      // no current authenticated user: throw exception 
      throw new NotAuthenticatedException(); 
     } 
     return null; // = continue without interrupting 
    } 
} 
+4

PreProcessInterceptor는 depreca입니다. 테드 – Reza

0

당신의 META-INF 같은/서비스, 아래 제공자 파일을 추가합니다. ws.rs.ext.Providers는 파일이고, 내용은 다음과 같은 필터의 경로입니다. com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter

관련 문제