2017-10-31 13 views
0

私は休憩申請にインターセプタを登録しようとしています。このインターセプタのpurpouseは、要求が有効であるかどうかを検証するために要求の中にトークンを取得することです。私はこれを達成するためにカスタムタグを作成している@Providerリソースが休憩アプリケーションに登録されていません

は:

@Provider 
@Secured 
public class AuthenticationFilter implements ContainerRequestFilter{ 

private static final Logger LOGGER = Logger.getLogger(AuthenticationFilter.class); 

UserDAO userDAO = (UserDAO) SpringApplicationContext.getBean("userDAO"); 

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

    // Get the HTTP Authorization header from the request 
    String authorizationHeader = 
     requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); 

    // Check if the HTTP Authorization header is present and formatted correctly 
    if (authorizationHeader == null || !authorizationHeader.startsWith("BSC")) { 
     if (authorizationHeader== null){ 
      LOGGER.error("No authorization header"); 
     } else{ 
      LOGGER.error("Authorization header: " + authorizationHeader); 
     } 
     throw new NotAuthorizedException("Authorization header must be provided"); 
    } 

    // Extract the token from the HTTP Authorization header 
    String token = authorizationHeader.substring("BSC".length()); 
    // Validate the token 
    boolean ok = validateToken(token); 

    if (!ok){ 
     LOGGER.error("Not authorized, passed token: " + token); 
     throw new NotAuthorizedException("Not authorized"); 
    } 


} 

private boolean validateToken(String token){ 
    boolean ok = userDAO.validateToken(token); 
    if (ok){ 
     userDAO.updateToken(token); 
    }else{ 
     userDAO.deleteToken(token); 
    } 

    return ok; 
} 

}

@NameBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE, ElementType.METHOD}) 
public @interface Secured { 

} 

@Securedタグを持つメソッドのすべてが迎撃throught渡す必要があります。

私はアプリケーションを拡張するクラスで迎撃し、残りのサービスを登録している:

public class RestApplication extends Application{ 
private Set<Object> singletons = new HashSet<Object>(); 

public RestApplication() { 
    singletons.add(new RestService()); 
    singletons.add(new AuthenticationFilter()); 
} 

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

はその後、私のweb.xmlに、私はこのクラスを登録している:

<web-app id="WebApp_ID" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<display-name>Manufacturing</display-name> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class> 
     com.sun.jersey.spi.container.servlet.ServletContainer 
    </servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.everis.manufacturing.application.RestApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

しかし、動作していないようですが、@Securedタグを持つサービスを呼び出していますが、インターセプタを呼び出すのではありません。

ありがとうございます!

答えて

0

Applicationの代わりにResourceConfigを拡張するようにRestApplicationクラスを変更してみてください。

+0

jerseyの唯一の依存関係はjersey-serverです。ResourceConfigを拡張しようとすると、com.sun.jersey.api.core.ResourceConfigという唯一のクラスが見つかりません。 – A1t0r

+0

パッケージ名はバージョンによって異なる場合があります。アプリケーションを拡張する場合は、それを使用することができます。それができない場合は、あなたの質問をライブラリのバージョンで更新できますか? – jay

関連する問題