2016-04-17 5 views
0

私はインターフェースを持っており、それをREST APIとして開くことを希望しています。ジャーナルにhttpヘッダーに基づいてパラメータを挿入する方法はありますか?

インタフェース:

string createToken(String username, String scopes); 

RESTのWeb API:単純なJava APIとして

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

,,インタフェース自体は理にかなっている - 特定の(ユニーク)ユーザーがアクセストークンを作成します。

しかし、REST Web APIとして、SSOキーのように、httpヘッダーで渡されるユーザーデータに基づいてユーザー名を取得する前の手順が必要です。

HTTPヘッダーから抽出したusernameに値を挿入するにはどうすればよいですか?ありがとうございます。

+0

関連:http://stackoverflow.com/q/23231511/435605 –

答えて

0

HeaderParamを使用してください。

@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

2番目のソリューションを使用したい場合は、インターフェイスを変更する必要がありますか?正しいパラメータに正しい値を注入するにはどうすればよいですか?文字列のユーザー名とスコープを混在させないようにする方法は? –

+0

注釈はユーザー名用です。それは方法のためではなく、スコープは絵にはありません。メソッドの引数に指定するスコープは、プロバイダのスコープとは異なります。 – randominstanceOfLivingThing

0

作成された値を注入するProvider:あなたはユーザ名を抽出し、それを注入する必要がある場合は、プロバイダを実装する必要がありますthis

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

を参照してください。カスタムアノテーションに変換します。小さな作業例hereを参照してください。以下のソースインラインも参照してください。

この例では、ssoトークンからユーザー名を抽出しています。これはダミー抽出です。

*私は@InjectParamを使用しませんでした。

呼び出し例:

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

カスタム注釈:値を注入したいのかを定義し

@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; 
    } 
} 

リソース:

注入を行うには

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

プロバイダ

@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> 
関連する問題