web-dev-qa-db-ja.com

JAX-RSサービスで認証ヘッダーを読み取る方法

JAX-RSサービスを使用して認証(および認証)を作成しようとしているAuthorizationヘッダーを初めて使用します

Javascriptのスニペットは次のようになります。

            sUrl = getURL() + "/com.cabRoutePlanner.Login/Login";  
            var oHeaders = {};
            oHeaders['Authorization'] = "Basic " + btoa(getUserName() + ":" + getPassword());

            var request = {
                headers : oHeaders,
                requestUri : sUrl,
                data: connectionData,
                method : "POST"
            };
            OData.request(request, onSuccessForRegister, onRegError);

ここで、JAX-RSサービスでこの認証ヘッダーを読みたいと思います。つまり、ユーザー名とパスワードをJava Restサービスに戻し、データベースで確認します。混乱しているのは、この認証ヘッダーを使用する方法がわかりません。誰かがRESTサービスで関数の宣言を表示し、ユーザー名とパスワードにアクセスするだけであれば、それは素晴らしいことです。

Eclipseの少しの直感と大きな助けを借りて、なんとかしてコードを書きました

@Path("/Log")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response log(HttpServletRequest req)throws JSONException
{
    JSONObject returnObject = new JSONObject();
    String authorization = req.getHeader("Authorization");
    if (authorization != null && authorization.startsWith("Basic")) 
    {
        //byte[] message = authorization.substring("Basic".length()).trim().getBytes();
        String credentials = authorization.substring("Basic".length()).trim();
        byte[] decoded = DatatypeConverter.parseBase64Binary(credentials);
        String decodedString = new String(decoded);
        String[] actualCredentials = decodedString.split(":");
        String ID = actualCredentials[0];
        String Password = actualCredentials[1];
        String Result = actualLog(ID, Password);
        if(Result.equals("ID Does not exist"))
        {
            returnObject.put("Result", "ID Does not exist");
            return Response.status(401).entity(returnObject).build();

        }
        else if(Result.equals("Password incorrect for given User"))
        {
            returnObject.put("Result", "Password incorrect for given User");
            return Response.status(401).entity(returnObject).build();
        }
        else
        {
            returnObject.put("Result", Result);
            return Response.status(200).entity(returnObject).build();
        }
    }
    else
    {
        returnObject.put("Result", "Authorization header wrong");
        return Response.status(401).entity(returnObject).build();
    }
}

さて、これが私が受けている現在の例外であり、私はそれを理解することができません:

 Oct 06, 2014 4:13:59 PM com.Sun.jersey.spi.container.ContainerRequest getEntity
 SEVERE: A message body reader for Java class javax.servlet.http.HttpServletRequest, and Java type interface javax.servlet.http.HttpServletRequest, and MIME media type application/octet-stream was not found.
 The registered message body readers compatible with the MIME media type are:
 application/octet-stream ->
 com.Sun.jersey.core.impl.provider.entity.ByteArrayProvider
 com.Sun.jersey.core.impl.provider.entity.FileProvider
 com.Sun.jersey.core.impl.provider.entity.InputStreamProvider
 com.Sun.jersey.core.impl.provider.entity.DataSourceProvider
 com.Sun.jersey.core.impl.provider.entity.RenderedImageProvider
 */* ->
 com.Sun.jersey.core.impl.provider.entity.FormProvider
 com.Sun.jersey.core.impl.provider.entity.MimeMultipartProvider
 com.Sun.jersey.core.impl.provider.entity.StringProvider
 com.Sun.jersey.core.impl.provider.entity.ByteArrayProvider
 com.Sun.jersey.core.impl.provider.entity.FileProvider
 com.Sun.jersey.core.impl.provider.entity.InputStreamProvider
 com.Sun.jersey.core.impl.provider.entity.DataSourceProvider
 com.Sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
 com.Sun.jersey.core.impl.provider.entity.ReaderProvider
 com.Sun.jersey.core.impl.provider.entity.DocumentProvider
 com.Sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
 com.Sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
 com.Sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
 com.Sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
 com.Sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
 com.Sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
 com.Sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
 com.Sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
 com.Sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
 com.Sun.jersey.core.impl.provider.entity.EntityHolderReader
 com.Sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
 com.Sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
 com.Sun.jersey.json.impl.provider.entity.JacksonProviderProxy
13
Pavanraotk

次のように、メソッドにリクエストを挿入するには、@Context HttpServletRequest requestを使用する必要があります。

public Response log(@Context HttpServletRequest req) throws JSONException

@Contextを使用して注入できるその他の便利なオブジェクトは次のとおりです(詳細については、JAX-RS仕様を参照してください)。

  • Application
  • UriInfoHttpHeaders
  • SecurityContext
  • ProvidersRequest
  • ServletConfigServletContextHttpServletRequest、およびHttpServletResponse

したがって、あなたの場合、@Context HttpHeaders headersを使用してから

List<String> authHeaders = headers.getRequestHeader(HttpHeaders.AUTHORIZATION);
16
Gas