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
次のように、メソッドにリクエストを挿入するには、@Context HttpServletRequest request
を使用する必要があります。
public Response log(@Context HttpServletRequest req) throws JSONException
@Context
を使用して注入できるその他の便利なオブジェクトは次のとおりです(詳細については、JAX-RS仕様を参照してください)。
Application
UriInfo
、HttpHeaders
SecurityContext
、Providers
、Request
ServletConfig
、ServletContext
、HttpServletRequest
、およびHttpServletResponse
したがって、あなたの場合、@Context HttpHeaders headers
を使用してから
List<String> authHeaders = headers.getRequestHeader(HttpHeaders.AUTHORIZATION);