我想根据调用的方法授权对我的rest api进行不同的调用。但RequestHandler
看起来像这样:
public interface RequestHandler {
Response handleRequest(Message m,
ClassResourceInfo resourceClass);
}
我无法弄清楚如何从Method
获取将要调用的resourceClass
。这可能吗?
ResponseHandler
似乎有一个名为OperationResourceInfo
的参数:
public interface ResponseHandler {
Response handleResponse(Message m,
OperationResourceInfo ori,
Response response);
}
但到那时,我已经删除了一些我无权删除的内容(例如)。
如何确定在请求过滤器中调用哪种方法? FWIW,我想要Method
的原因是因为我想搜索我将放在每个方法上的自定义构建的注释。如果有更好的方法来解决这个问题,我可以接受这个想法。
为了完整起见,请参阅以下主题的文档:http://cxf.apache.org/docs/jax-rs-filters.html
答案 0 :(得分:1)
您可以使用拦截器而不是RequestHandler
过滤器,因为不推荐使用请求处理程序并在JAXRS 2.0中使用ContainerRequestFilter
和ContainerResponseFilter
替换
例如
说我的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);
}
}
}