Java jersey 导入包
Posted
技术标签:
【中文标题】Java jersey 导入包【英文标题】:Java jersey importing packages 【发布时间】:2015-06-06 07:04:52 【问题描述】:我正在尝试重新制作此处找到的解决方案 Basic HTTP authentication with Jersey / Grizzly
到目前为止,我已经包含了这些导入
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response.Status;
经过一番搜索,我把这个加入了
import org.glassfish.jersey.server.ContainerRequest;
我的问题是我得到了这些错误
... AuthFilter is not abstract and does not override abstract method filter(ContainerRequestContext) in ContainerRequestFilter
... method does not override or implement a method from a supertype
... cannot find symbol
[ERROR] symbol: method getHeaderValue(String)
[ERROR] location: variable containerRequest of type ContainerRequest
如果你不想切换标签,代码在这里
@Override
public ContainerRequest filter(ContainerRequest containerRequest)
throws WebApplicationException
// Automatically allow certain requests.
String method = containerRequest.getMethod();
String path = containerRequest.getPath(true);
if (method.equals("GET") && path.equals("application.wadl"))
return containerRequest;
// Get the authentication passed in HTTP headers parameters
String auth = containerRequest.getHeaderValue("authorization");
if (auth == null)
throw unauthorized;
不幸的是,我没有必要的声誉来询问 OP,因此我们不胜感激。
编辑:显然是 com.sun.jersey.spi.container.ContainerRequest 不包括 getHeadervalue 和 jersey 2.0 找不到的那个有什么办法吗?
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerRequestContext;
import org.glassfish.jersey.internal.util.Base64;
import java.io.IOException;
public class AuthFilter implements ContainerRequestFilter
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException
String method = requestContext.getMethod();
String path = requestContext.getUriInfo().getPath();
String auth = requestContext.getHeaderString("authorization");
if (auth == null)
throw new AuthenticationException("Too bad");
//how to import that ^
auth = auth.replaceFirst("[Bb]asic ", "");
String entry = new String(Base64.decode(auth));
if (!entry.equals("admin:password"))
throw new AuthenticationException("Too bad");
【问题讨论】:
【参考方案1】:链接中的该类正在实现特定于 Jersey 1,ContainerRequestFilter
。该类名从 JAX-RS 2 (Jersey 2.x) 开始成为标准类(只是名称)。该方法的新签名是
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
public class Hello implements ContainerRequestFilter
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
requestContext.getMethod();
requestContext.getUriInfo().getPath();
requestContext.getHeaderString("authorization");
我将更改后的调用添加到该类中使用的一些类似方法
您还可以找到指向完整基本身份验证示例in this answer 的链接。它来自 Jersey 项目示例,它使用 Jersey 2
【讨论】:
谢谢。考虑到您的建议,我已经更新了原始问题。如何导入 AuthenticationException? 这很可能是作者的混合物。这不是一个标准的课程。只需使用javax.ws.rs.NotAuthorizedException
。但是,您需要做的一件事是,当身份验证失败或没有标头时,发送标头 WWW-Authenticate: Basic realm=SomeRealm
,而您的代码的作者没有这样做。这是Basic Authentication Protocol 的一部分
我明白了。我的程序将编译但在测试中失败,所以仍然没有太多工作。仍然你真的很有帮助,我会接受答案。不知道如何做标题的事情,但不要打扰。谢谢。
Here is a better (complete) example。身份验证发生在SecurityFilter
中,并且有一些自定义异常被映射到ExceptionMapper
,它发送适当的标头以上是关于Java jersey 导入包的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.NoSuchMethodError:org.glassfish.jersey.server.ApplicationHandler。
用Jersey构建RESTful服务7--Jersey+SQLServer+Hibernate4.3+Spring3.2
用Jersey+spring+hibernate构建RESTful服务
将使用 jersey 1.x 的 java 代码转换为 jersey 2.x