我想根据调用的方法以不同方式授权对我的 rest api 的调用。但是 RequestHandler
看起来像这样:
public interface RequestHandler {
Response handleRequest(Message m,
ClassResourceInfo resourceClass);
}
我不知道如何获取将从 resourceClass
调用的 Method
。这可能吗?
ResponseHandler
似乎有一个名为 OperationResourceInfo
的参数:
public interface ResponseHandler {
Response handleResponse(Message m,
OperationResourceInfo ori,
Response response);
}
但到那时,我将已经删除了我无权删除的内容(例如)。
如何确定将在请求过滤器中调用的方法? FWIW,我想要 Method
的原因是因为我想搜索我将在每个方法上放置的自定义注释。如果有更好的方法来解决这个问题,我愿意接受这个想法。
为了完整起见,这里是关于该主题的文档:http://cxf.apache.org/docs/jax-rs-filters.html
最佳答案
您可以使用拦截器,而不是 RequestHandler
过滤器,因为请求处理程序在 JAXRS 2.0 中已被弃用并替换为 ContainerRequestFilter
和 ContainerResponseFilter
/p>
例如
假设我有如下所示的 RestService
@Service
@Path("/Course")
public class KPRestService {
private final Logger LOG = LoggerFactory.getLogger(KPRestService.class);
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
public Response create(CourseType course){
LOG.info("You have selected {}", course.getCName());
return Response.ok().build();
}
@POST
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public CourseType get(@FormParam("cDate")Date date){
final CourseType course = new CourseType();
if(date.after(new Date())){
course.setCName("E&C");
course.setCDuration(4);
}else{
course.setCName("Mech");
course.setCDuration(3);
}
return course;
}
}
我阻止使用拦截器调用 get 方法,如下所示。
@Component
public class KPFilter extends AbstractPhaseInterceptor<Message> {
private final static Logger LOG = LoggerFactory.getLogger(KPFilter.class);
public KPFilter() {
super(Phase.PRE_LOGICAL);
}
public void handleMessage(Message message) throws Fault {
final Exchange exchange = message.getExchange();
exchange.put(Message.REST_MESSAGE, Boolean.TRUE);
OperationResourceInfo resourceInfo = exchange.get(OperationResourceInfo.class);
LOG.info("Method name is {}", resourceInfo.getMethodToInvoke().getName());
if (resourceInfo != null && resourceInfo.getMethodToInvoke().getName().equals("get")) {
Response response = Response.status(Response.Status.FORBIDDEN).entity("You are not authorised")
.type(MediaType.TEXT_XML).build();
exchange.put(Response.class, response);
}
}
}
关于java - 在 CXF RS 中,我可以在请求过滤器中获取资源方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637111/