Java 如何在JAX-RS服务中读取授权头

Java 如何在JAX-RS服务中读取授权头,java,header,authorization,jax-rs,Java,Header,Authorization,Jax Rs,我不熟悉Authorization header,尝试使用JAX-RS服务创建授权(和身份验证) 我的javascript代码片段如下所示: sUrl = getURL() + "/com.cabRoutePlanner.Login/Login"; var oHeaders = {}; oHeaders['Authorization'] = "Basic " + btoa(getUserName() + ":" + ge

我不熟悉Authorization header,尝试使用JAX-RS服务创建授权(和身份验证)

我的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);
public Response log(@Context HttpServletRequest req) throws JSONException
现在,我想在JAX-RS服务中读取这个授权头,即返回JavaREST服务中的用户名和密码,并与我的db进行检查。我感到困惑的是,我不知道如何使用这个授权头。如果有人能让我看看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
在方法中插入请求,如下所示:

            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);
public Response log(@Context HttpServletRequest req) throws JSONException
可以使用
@Context
注入的其他有用对象有(有关详细信息,请参阅JAX-RS规范):

  • 应用程序
  • UriInfo
    HttpHeaders
  • SecurityContext
  • 提供者
    请求
  • ServletConfig
    ServletContext
    HttpServletRequest
    HttpServletResponse
因此,在您的例子中,您还可以使用
@Context-HttpHeaders
,然后

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

您应该使用
@Context-HttpServletRequest-request
在方法中插入请求。但是我强烈建议您使用JavaEE安全性,让容器来处理身份验证,而不是自己编写。您的应用程序已经完美地解决了这个问题,谢谢:)。但是我不允许把它标成绿色,不知道为什么??!!同时,我考虑了JavaEE安全性,但我不确定是否可以使用它,是否有许多注册到应用程序中,我必须为其提供登录凭据、角色。所以,要发展这样一个场景是不可能的,对吗?因为,我添加的每个新用户都必须在web-server.xml中添加用户凭据和角色?如果没有办法实现自动化,那么这对我来说将是一个问题,因此处理程序需要与数据库通信!Pavanraotk,你不能接受,因为这是评论。我已经添加了它作为答案,所以您现在可以接受它;)。稍后我将写更多关于JavaEE安全性的文章。关于JavaEE安全性的Pavanraotk——在类似的情况下,您创建角色并将这些角色映射到组,而不是特定的用户。然后,当您创建新用户时,只需将其添加到特定的组(充当角色),而无需修改xml中的约束。大多数服务器都提供API,允许您将代码插入到身份验证过程中,甚至可以插入到诸如file或db registry之类的示例实现中。这就是为什么对于身份验证,我建议使用服务器基础结构,对于授权,如果它非常复杂,您可以在代码中创建逻辑。