我正在使用 JAX-RS 2 测试 RESTful 服务。下面是我的项目和我的类。
@ApplicationPath("/test/*")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> clazz = new HashSet<>();
clazz.add(UserResource.class);
System.out.println("getClass");
return clazz;
}
Run Code Online (Sandbox Code Playgroud)
资源类如:
@ApplicationPath("/test/*")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> clazz = new HashSet<>();
clazz.add(UserResource.class);
System.out.println("getClass");
return clazz;
}
Run Code Online (Sandbox Code Playgroud)
当我使用 测试服务时http://localhost:8082/dt/test/user,出现 404 错误。
我有一个包含三个资源的 REST-API。第一个中的方法称为 PublicResource,任何人都应该可以访问(即匿名访问)。第二个方法中的方法称为 SecretResource,应该只能由特定的用户组访问。最后,称为 MixedResource 的第三个资源具有混合设置,其中一些方法受到保护,一些方法对公共访问开放。
注释@PermitAll 和@RolesAllowed 并不像我期望的那样工作。尽管 PublicResource 用 @PermitAll 进行了注释,但我在尝试访问它时仍然会被要求授权。MixedResource 中用@PermitAll 注释的方法也是如此。所以基本上,我的所有资源都被要求授权,即使我应该匿名访问。
我在 Payara 4.1 上运行,我很困惑,因为我在另一个运行在 WebLogic 12.1.3 上的应用程序中进行了非常相似的设置,并且注释按预期工作。我错过了什么或弄错了什么?在下面查看我的完整代码。
公共资源.java:
import javax.annotation.security.PermitAll;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("public")
@PermitAll
public class PublicResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String itsPublic() {
return "public";
}
}
Run Code Online (Sandbox Code Playgroud)
秘密资源.java:
import javax.annotation.security.RolesAllowed;
import javax.ws.rs.GET;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("secret")
@RolesAllowed({ "SECRET" })
public class SecretResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String itsSecret() {
return "secret";
}
}
Run Code Online (Sandbox Code Playgroud)
混合资源.java:
import …Run Code Online (Sandbox Code Playgroud) 这是我的身份验证过滤器:
@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecuredFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) {
String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
}
String token = authorizationHeader.substring("Bearer".length()).trim();
// [...]
}
}
Run Code Online (Sandbox Code Playgroud)
为什么在缺少标头时它不会中止并发回响应? 现在我在 authorizationHeader.substring 得到一个明显的 NPE ...
该文件说:
void abortWith(响应响应)
使用响应中止过滤器链。此方法中断过滤器链处理并将提供的响应返回给客户端。提供的响应通过适用的响应过滤器链。参数: response - 要发送回客户端的响应。
我错过了什么?
我正在尝试使用 Mockito 对使用 @NameBinding 应用的 ContainerRequestFilter 进行单元测试。过滤器检查注释字段以确定要执行的操作。查看示例代码:
注解
@Target({TYPE, METHOD})
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
MyEnum info() default MyEnum.DEFAULT;
}
Run Code Online (Sandbox Code Playgroud)
我的枚举
public enum MyEnum {
VALUE1,
VALUE2,
DEFAULT
}
Run Code Online (Sandbox Code Playgroud)
使用 MyEnum 作为条件的带注释的过滤器
@MyAnnotation
public class MyFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE1))
{
// set some value or throw some exception (this can be verified in the test)
}
if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE2))
{
// set some value or throw …Run Code Online (Sandbox Code Playgroud) 我有一个查询参数如下:
@GET
public Response myFunction(@QueryParam("start") final LocalDate start, @QueryParam("end") final LocalDate end) { ... }
Run Code Online (Sandbox Code Playgroud)
为此,我创建了一个ParamConverter<LocalDate>将字符串转换为日期,反之亦然。
现在我想使用@DefaultValue注解来声明一个默认值。我有两个特殊的默认值:
start)end)是否可以为此使用@DefaultValue注释?如何?
WebLogic 12c 包含一个默认 JAX-RS 资源 ( https://docs.oracle.com/cd/E24329_01/web.1211/e24983/configure.htm#RESTF191 ),该资源将使用 JAX-RS 批注注解的所有类注册为资源。
我使用 Jersey 代理客户端(http://blog.alutam.com/2012/05/04/proxy-client-on-top-of-jax-rs-2-0-client-api/),所以我的界面类具有所有 JAX-RS 注释并打包在它们自己的“API”jar 中。然后将 API jar 部署到基本上两个不同的上下文:服务和客户端。该服务提供 API 的实现,它是实际的业务逻辑,并作为 JAX-RS Web 服务公开。客户端只是服务的消费者,API jar 中服务接口的实现是 Jersey 代理客户端。
不幸的是,WebLogic 12c 在这里给我带来了两个问题:
1) 它会自动注册我的 API jar 中的所有资源,并将它们作为来自客户端应用程序的 Web 服务公开(实现是(现在实际上是)代理客户端)!这是非常意外的。
2) 有时我想使用 API 中的类而不实际使用服务,所以我什至不提供接口的实现。这应该没问题,但是因为 WebLogic 尝试自动加载 API 资源,但没有找到带注释的接口的实现,所以它拒绝部署战争。
我可以在 web.xml 中使用安全策略或奇怪的 jax-rs 配置解决问题 1,但这并不能解决问题 2。最好的解决方案是关闭 WebLogic 中的默认资源,但我找不到这样做的任何文件。
有没有办法关闭WebLogic中的默认资源或关闭自动Jersey扫描?
我已经多次看到 JAXRS 资源的几种配置方式。
我的意思是,有时我看到它们被注释为@Singleton, @Stateless, @ApplicationScoped, @RequestScoped, 甚至没有任何注释或同时使用它们。
javax.enterprise.context.RequestScopedjavax.enterprise.context.ApplicationScopedjavax.ejb.Statelessjavax.ejb.Singletonjavax.inject.Singleton我应该使用哪个注释?
有什么javax.ejb用JAXRS资源呢?
另一方面,我也想知道如何准确地使用@Context注释。
我的意思是,我已经看到这应用于参数,也在类字段中。
@Path("entity")
public class EntityResource {
@Context
private Request request;
@POST
public Response create(Entity entity) {
this.request...
}
}
Run Code Online (Sandbox Code Playgroud)
或者,
@Path("entity")
public class EntityResource {
@POST
public Response create(Entity entity, @Context Request request) {
request...
}
}
Run Code Online (Sandbox Code Playgroud)
我将如何进行?
我已经看到在GET和POST请求中都完成了基本身份验证。
一方面,我认为浏览器缓存GET请求可能是一个问题,但另一方面:POST更大但鼓励提供敏感信息。
我不是在问GET和POST请求之间的区别,而是应该将哪一个用于基本身份验证。应该GET只与 HTTPS 一起使用吗?应该POST一直使用吗?
我的问题是应该使用哪一个?哪个是更好的做法?
java rest restful-authentication jax-rs basic-authentication
我正在尝试实现某种基于角色的身份验证。我正在使用 JWT 令牌。我一直在看指南,但他们都提到了“Spring boot”的使用。我将如何在 Java 的 Restful 端点上设置基于角色的身份验证?最好通过某种过滤器。
我正在寻找一种方法来简单地添加:@Role(Role.ADMIN)在端点之前。
我已经设置了以下课程:
枚举角色:
public enum Role {
User,
Admin
}
Run Code Online (Sandbox Code Playgroud)简单的 JWT 令牌:
{
"sub": "users/TzMUocMF4p",
"exp": 1554646441,
"username": "username@gmail.com",
"ID": 6,
"Role": "Admin",
"iat": 1554641041
}
Run Code Online (Sandbox Code Playgroud)简单的 CRUD 端点
@Path("User")
public class UserResource {
@EJB
private UserDAO userappDAO;
@GET
@JWTTokenNeeded
@Produces("application/json")
public List<Userapp> all() {
return userappDAO.getAll();
}
}
Run Code Online (Sandbox Code Playgroud)JWT 验证 ( @JWTTokenNeeded) 类如下:
@javax.ws.rs.NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface JWTTokenNeeded {
}
Run Code Online (Sandbox Code Playgroud)
实际过滤器:
@Provider
@JWTTokenNeeded
@Priority(Priorities.AUTHENTICATION)
public …Run Code Online (Sandbox Code Playgroud)jax-rs ×10
java ×8
jersey ×5
rest ×4
jakarta-ee ×2
cdi ×1
java-time ×1
jersey-2.0 ×1
jwt ×1
mockito ×1
security ×1
unit-testing ×1
weblogic ×1