Java 如何在JAX-RS服务中读取授权头
我不熟悉Authorization header,尝试使用JAX-RS服务创建授权(和身份验证) 我的javascript代码片段如下所示: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
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之类的示例实现中。这就是为什么对于身份验证,我建议使用服务器基础结构,对于授权,如果它非常复杂,您可以在代码中创建逻辑。