java – Servlet过滤器与CXF拦截器,用于修改请求和响应内容?
|
我们已经使用Apache CXF构建了一些REST(jax-rs)Web服务.他们返回 JSON响应. 我现在需要修改一些请求参数和响应内容. (基本上,我们需要对服务返回的一些数据进行编码/加密;当在后续服务调用中用作参数时,对同一数据进行解码/解密). 看来我至少有4个选择: >使用Servlet过滤器 之前我已经使用过Servlet过滤器,并且明白了如何修改请求参数和响应体,所以我倾向于这一点.但是,如果CXF使用CXF拦截器或JAX-RS过滤器,那么在使用CXF时可以使用更正确的方法来解决这个问题.但是根据文档,我真的不明白如何做到这一点.例如,我使用Message对象的setContent方法来更改JSON响应?在这种情况下,格式参数是什么,只是String.class? 解决方法在这里回答我自己的问题…我最终使用了一个JAX-RS过滤器,一旦我缺少文档,它就能很好地运行.我使用了 http://cxf.apache.org/docs/jax-rs-filters.html的(相当稀疏的)文档.注意,尽管它的名字,JAX-RS过滤器是一个CXF特定的野兽,不是JAX-RS标准的一部分(据我所知).以下是一些示例代码: @Context
private HttpServletRequest httpRequest;
@Context
private UriInfo uriInfo;
/**
* @see org.apache.cxf.jaxrs.ext.ResponseHandler#handleResponse(org.apache.cxf.message.Message,org.apache.cxf.jaxrs.model.OperationResourceInfo,javax.ws.rs.core.Response)
*/
public Response handleResponse(Message message,OperationResourceInfo opResourceInfo,Response response) {
try {
// log the injected context data; useful for debugging CXF problems
logContextData(httpRequest,uriInfo);
OutputStream os = message.getContent(OutputStream.class);
String relevantData = getDataFromRequest(httpRequest);
message.setContent(OutputStream.class,new MyOutputStreamWrapper(os,relevantData));
} catch (CustomException e) {
// return some status that is related to CustomException
return Response.status(Status.UNAUTHORIZED).build();
} catch (Exception e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
return response;
}
/**
* @see org.apache.cxf.jaxrs.ext.RequestHandler#handleRequest(org.apache.cxf.message.Message,org.apache.cxf.jaxrs.model.ClassResourceInfo)
*/
public Response handleRequest(Message message,ClassResourceInfo classResourceInfo) {
try {
// log the injected context data; useful for debugging CXF problems
logContextData();
String updatedQueryString = buildNewQueryString(this.uriInfo,httpRequest);
message.put(Message.QUERY_STRING,updatedQueryString);
// returning null tells CXF to continue the request (i.e. a non-null value would halt the request)
return null;
} catch (CustomException e) {
// return some status that is related to CustomException
return Response.status(Status.UNAUTHORIZED).build();
} catch (Exception e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
}
我应该注意,MyOutputStreamWrapper的实现是修改响应内容的重要部分.由于安全考虑,我不能将这个源包含在这里(实际上我的实现具有不同的名称). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java 中 MD5加密的实例
- java – List.toArray(Object [])性能
- Dart的快照和Java字节码有什么区别?
- java – Paypal Sandbox支付状态待定
- java实现多线程的两种方式继承Thread类和实现Runnable接口的
- java – Google Play服务错误 – 错误报告难以理解
- android 超轻量级数据存储类
- springboot如何读取配置文件(application.yml)中的属性值
- Java计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)
- jbas015852无法索引类java.lang.IllegalStateException:未
