2016-07-26 4 views
6

기존 클래스가 있습니다. 사용자에게 시스템으로 SSO하도록 일부 헤더 매개 변수를 가져 오려는 기존 클래스가 있습니다. 수업은 다음과 같습니다. 내가 알아 내기 위해 노력하고있어클래스의 메서드에 @Context 인수 전달

import java.util.Map; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 

import org.springframework.stereotype.Component; 

@Component 
@Path("/http") 
public class HttpResource { 
    @GET 
    @Path("/getHeaders") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Map<String, String> getAllHeaders(@Context HttpHeaders headers) { 
     Map<String, String> headerList = new HashMap<String, String>(); 
     for (String key : headers.getRequestHeaders().keySet()) { 
      String value = headers.getRequestHeader(key).get(0); 
      System.out.println(key + " : " + value); 
      headerList.put(key, value); 
     } 
     return headerList; 
    } 
} 

내가 @Context 인수 getAllHeaders() 전화를 어떻게입니까? 나는 가지고있는 수업의 표본을 많이 찾았지만 그것을 불러내는 방법은 보여주지 못했다.

나는 또한 주석 대신 클래스 내부에 주석을 넣으려고 시도했다.

@Context 
HttpHeaders httpHeaders; 

httpHeaders.getAllHeaders()에 액세스하려고하면 null이 반환됩니다. javax 문서가 null을 반환하지 않는다고 말하면 실제로 생성되지 않았기 때문에 가정합니다.

내 SSOAuthorizationFilter.java 내에서 이것을 호출하려고하지만 컨트롤러를 통해 액세스하려고 시도했습니다.

+0

어떤 프레임 워크를 사용하고 있습니까? 봄/레스트 쉽/저지? –

+0

@ Shiraaz.M Spring –

답변

4

먼저 주석을 작성하십시오.

@Retention(RUNTIME) 
@Target({ PARAMETER }) 
@Documented 
public @interface SSOAuthorization {} 

그런 다음 리졸버.

public class SSOAuthorizationResolver { 

    public static class SSOAuthorizationInjectionResolver extends 
      ParamInjectionResolver<SSOAuthorization> { 
     public SSOAuthorizationInjectionResolver() { 
      super(SSOAuthorizationValueFactoryProvider.class); 
     } 
    } 


    @Singleton 
    public static class SSOAuthorizationValueFactoryProvider extends 
      AbstractValueFactoryProvider { 

     @Context 
     private HttpHeaders httpHeaders; 

     @Inject 
     public SSOAuthorizationValueFactoryProvider(
       final MultivaluedParameterExtractorProvider mpep, 
       final ServiceLocator injector) { 
      super(mpep, injector, Parameter.Source.UNKNOWN); 
     } 

     @Override 
     protected Factory<?> createValueFactory(final Parameter parameter) { 
      final Class<?> classType = parameter.getRawType(); 

      if (!Language.class.equals(classType) 
        || parameter.getAnnotation(SSOAuthorization.class) == null) { 
       return null; 
      } 

      return new AbstractContainerRequestValueFactory<String>() { 
       @Override 
       public String provide() { 
        // Can use httpHeader to get your header here. 
        return httpHeader.getHeaderString("SSOAuthorization"); 
       } 
      }; 
     } 

    } 

    // Binder implementation 
    public static class Binder extends AbstractBinder { 
     @Override 
     protected void configure() { 

      bind(SSOAuthorizationValueFactoryProvider.class).to(
        ValueFactoryProvider.class).in(Singleton.class); 

      bind(SSOAuthorizationInjectionResolver.class).to(
        new TypeLiteral<InjectionResolver<SSOAuthorization>>() { 
        }).in(Singleton.class); 

     } 

    } 
} 

그리고 ResourceConfig에서

public class MyResourceConfig extends ResourceConfig { 

    public MyResourceConfig(Class... classes) { 
     super(classes); 
     register(new SSOAuthorizationResolver.Binder()); 
    } 
} 

리졸버

를 등록 그리고 마지막으로 @SSOAuthorization 주석 컨트롤러에서 사용.

@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_JSON) 
public String someMethod(@SSOAuthorization String auth) { 
    return auth; 
}