2016-04-17 3 views
0

У меня есть интерфейс и вы хотите открыть его как REST API.Как использовать джерси в качестве параметра на основе заголовка http?

Интерфейс:

string createToken(String username, String scopes); 

REST Web API:

@GET 
@Path("/createToken") 
@Override 
public string createToken(@InjectParam String username, String scopes) { 
    ... 
} 

Как простой Java API ,, интерфейс сам имеет смысл - создание маркеров доступа по конкретному (уникальному) пользователю.

Но, как веб-API REST, мне нужен предыдущий шаг для извлечения имени пользователя на основе некоторых пользовательских данных, которые передаются в заголовке http, как ключ SSO.

Как добавить значение в username - извлеченный из HTTP-заголовка? Спасибо.

+0

Связанный: http://stackoverflow.com/q/23231511/435605 –

ответ

0

Вы должны использовать HeaderParam. См this

@GET 
@Path("/createToken") 
@Override 
public string createToken(@HeaderParam("username") String username, String scopes) { 
    ... 
} 

Если вы должны извлечь имя пользователя и должны вводить его, вам придется реализовать поставщика:

@Provider 
public class UsernameProvider 
     extends AbstractHttpContextInjectable<Locale> 
     implements InjectableProvider<Context, Type> { 

    @Override 
    public Injectable<E> getInjectable(ComponentContext compCntxt, Context cntxt, Type typ) { 
     if (typ.equals(String.class)) { 
      return this; 
     } 
     return null; 
    } 

    @Override 
    public ComponentScope getScope() { 
     return ComponentScope.PerRequest; 
    } 

    @Override 
    public String getValue(HttpContext httpCntxt) { 
     final Request rqst = httpCntxt.getRequest(); 
     String username = null; 
     //Extract 'username' from Headers 
     return username; 
    } 
} 

Подробное объяснение here

+0

Имя пользователя, не передается. Не в заголовке. Некоторые другие данные передаются в заголовке http, и для преобразования этих данных в имя пользователя требуется предыдущий шаг. –

+0

Если я хочу использовать второе решение, нужно ли изменить интерфейс? Как ввести правильное значение правильному параметру? Как предотвратить смешивание имени и области строки String? –

+0

Аннотация для имени пользователя. Это не метод, а масштаб не отображается. Объем, который у вас есть в аргументах метода, отличается от области действия поставщика. – randominstanceOfLivingThing

0

создал Provider, чтобы придать значение в пользовательскую аннотацию. См. Небольшой рабочий пример here. См. Также строку источника ниже.

В примере извлекается имя пользователя из токена sso. Это фиктивная добыча.

* Я не использовал @InjectParam.

Призвание пример:

curl -X POST -H "ssoToken: 1234" http://localhost:8080/JerseyCustomParamInjection-1.0-SNAPSHOT/oauth2/createAccessToken 

аннотаций:

@Target({ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LoggedUser { 
} 

Provider сделать инъекцию:

@Provider 
public class LoggedUserProvider implements 
     Injectable<String>, 
     InjectableProvider<LoggedUser, Parameter> { 

    @Context 
    private HttpServletRequest request; 

    public LoggedUserProvider() { 
    } 

    @Override 
    public Injectable<String> getInjectable(ComponentContext cc, LoggedUser a, com.sun.jersey.api.model.Parameter c) { 
     return this; 
    } 

    @Override 
    public ComponentScope getScope() { 
     return ComponentScope.PerRequest; 
    } 

    @Override 
    public String getValue() { 
     String sso = request.getHeader("ssoToken"); 
     if (sso == null) { 
      throw new WebApplicationException(Response.Status.UNAUTHORIZED); 
     } 
     // Retreive username from soo 
     String username = " <extracted username from sso="+sso+">"; 
     return username; 
    } 
} 

ресурс, который определяет, хочет, чтобы ввести значение:

@Path("/oauth2") 
public class Resource { 

    @POST 
    @Path("/createAccessToken") 
    public String createAccessToken(
      @LoggedUser String username 
    ) { 
     return username + " <created access token using the logged in injected username>"; 
    } 
} 

конфигурации сервлета (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>Restful Web Application</display-name> 
    <servlet> 
     <servlet-name>jersey-serlvet</servlet-name> 
     <servlet-class> 
      com.sun.jersey.spi.container.servlet.ServletContainer 
     </servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>info.fastpace.jerseycustomparaminjection</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>jersey-serlvet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
Смежные вопросы