我正在使用带有XMLHttpRequest(XHR)的JAX-RS接口。由于XHR预检,XHR在调用真实资源之前始终发送OPTIONS。
现在我有很多方法,我需要每个resoruce的OPTIONS。有没有办法自动完成?我不想写几十种方法,如:
@OPTIONS
@Path("/{id}")
@PermitAll
public Response optionsById() {
return Response.status(Response.Status.NO_CONTENT).build();
}
@OPTIONS
@Path("/{id}/data")
@PermitAll
public Response optionsByData() {
return Response.status(Response.Status.NO_CONTENT).build();
}
答案 0 :(得分:4)
更新09/12/2013:这不起作用。使用这个全部@ GET / @ DELETE / @ POST / @ PUT不再工作了。
最后我解决了我的问题。我创建了一个超类OptionsResource
,所有资源都从中继承。此resoruce包含:
// Match root-resources
@OPTIONS
@PermitAll
public Response options() {
return Response.status(Response.Status.NO_CONTENT).build();
}
// Match sub-resources
@OPTIONS
@Path("{path:.*}")
@PermitAll
public Response optionsAll(@PathParam("path") String path) {
return Response.status(Response.Status.NO_CONTENT).build();
}
一个例子:
@Path("/test")
public class TestResource extends OptionsResource {
@GET
@Produces("text/plain;charset=UTF-8")
public Response index() {
return Response.status(Status.OK).entity("works").build();
}
}
匹配:
答案 1 :(得分:0)
回复很晚,但是更好的解决方案是使用一个过滤器,该过滤器在路径匹配之前捕获所有OPTIONS调用。在Kotlin中,它将如下所示:
@Provider @PreMatching
class OptionsFilter: ContainerRequestFilter {
override fun filter(requestContext: ContainerRequestContext) {
if (requestContext.method == "OPTIONS") {
requestContext.abortWith(Response.status(Response.Status.NO_CONTENT).build())
}
}
}
答案 2 :(得分:0)
Java版本:
@Provider
@PreMatching
public class OptionFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (requestContext.getMethod().contentEquals("OPTIONS")) {
requestContext.abortWith(Response.status(Response.Status.NO_CONTENT).build());
}
}
}