1

私は一般的にWebサービスに不慣れで、それについて多くの調査を行ってきましたが、現在、認証目的で必要なリクエストヘッダーをキャプチャできません.

シナリオは次のとおりです。要求ヘッダーにユーザー名とパスワードの組み合わせを追加した後、JAX-RS RESTful Web サービスで login() メソッドを呼び出す Android クライアントがあります。Web サービス (JBoss AS 7.1 で実行) は、これらのヘッダーをキャプチャする必要があります。

問題は、この login() メソッドが呼び出されるたびに、リクエストがまだ処理されていないように見えるため、WebServiceContext.getMessageContext() の実行時に IllegalStateException が発生することです。

メソッドのヘッダーに @PostConstruct アノテーションを追加しようとしましたが、役に立ちませんでした。これを行うと、メソッドはまったく初期化されていないようです。代わりに、呼び出し時に ClassNotFoundException があります。

どうすればこの問題を解決できますか? 私は何日もこれに固執し、クライアントと Web サービスの両方でこれらのヘッダーをキャプチャするために複数の異なるアプローチを試みましたが、それらはプロジェクトのアーキテクチャに適用されないか、単に期待どおりに機能しません。

サービスのインターフェースは次のとおりです。

@ApplicationPath("/apppath")
@Path("/wspath")
public interface LoginService {

    @GET
    @Path("/login")
    @Produces(MediaType.APPLICATION_JSON)
    public String login();
}

サービスの実装は次のとおりです。

@Stateless
@Local(LoginService.class)
public class LoginServiceImpl implements LoginService {

    @Resource
    WebServiceContext wsContext;

    @Override
    public String login() {

        // This line throws an IllegalStateException.
        MessageContext msgContext = wsContext.getMessageContext();

        // TODO: Capture authentication data from headers.   
        @SuppressWarnings("unchecked")
        Map<String, List<String>> headers = (Map<String, List<String>>) msgContext.get(MessageContext.HTTP_REQUEST_HEADERS);

        // Dummy return for testing purposes.
        return "It works" + headers.toString();
    }
}

クライアント側の問題を修正するために取り組んでいる簡単な JUnit テスト コードを次に示します。

public class LoginServiceTest {

    @Test
    public void test() {

        String mEmail = "a@a.com";
        String mPassword = "aaaa";

        HttpGet request = new HttpGet("http://localhost:8080/apppath/wspath/login"); 

        String auth = Base64.encodeBytes((mEmail + ":" + mPassword).getBytes());
        request.addHeader("Authorization", "Basic " + auth);

        HttpClient httpClient = new DefaultHttpClient();

        try {
            InputStream inputStream = httpClient.execute(request).getEntity().getContent();

            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));             
            String wsReturn;

            while ((wsReturn = bufferedReader.readLine()) != null) {
                System.out.println(wsReturn);
            }
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

0

これは、JAX-RS サービスでサービス コンテキストにアクセスする正しい方法ではありません。WebServiceContextクラスは JAX-WS Web サービスに注入されます。JAX-RS サービス クラスでは、@Contextアノテーションを使用してHttpServletRequestリクエスト オブジェクトを挿入し、ヘッダーを要求できます。例えば:

@GET
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
public String login(@Context HttpServletRequest request);

このリンクを参照して、JAX-RS に関する詳細情報を入手するか、Java EE 6 チュートリアルを参照してください。

于 2013-01-21T08:32:42.783 に答える