2012-02-07 35 views
10

Chúng tôi đã xây dựng một số dịch vụ web REST (jax-rs) bằng Apache CXF. Chúng trả về một phản hồi JSON.Bộ lọc Servlet so với máy đánh chặn CXF để sửa đổi nội dung yêu cầu và phản hồi?

Tôi hiện cần sửa đổi một số thông số yêu cầu và nội dung phản hồi. (Về cơ bản, chúng tôi cần mã hóa/mã hóa một số dữ liệu được dịch vụ trả về và giải mã/giải mã cùng một dữ liệu khi nó được sử dụng làm tham số trong cuộc gọi dịch vụ tiếp theo.)

Có vẻ như tôi có ít nhất 4 lựa chọn ở đây:

  1. sử dụng bộ lọc Servlet
  2. sử dụng một CXF Interceptor
  3. sử dụng JAX-RS lọc
  4. không sử dụng bất kỳ mô hình cụ thể, và thực hiện việc mã hóa/giải mã trong thực tế logic dịch vụ.

Tôi đã sử dụng Bộ lọc Servlet trước đây và hiểu chính xác cách sửa đổi thông số yêu cầu và nội dung phản hồi, vì vậy tôi nghiêng về phía đó. Tuy nhiên, tôi đang mở để sử dụng bộ lọc đánh chặn CXF hoặc bộ lọc JAX-RS nếu đó là cách 'chính xác' hơn để giải quyết vấn đề này khi sử dụng CXF. Nhưng dựa trên tài liệu, tôi không thực sự hiểu được cách để thực hiện việc này. Ví dụ, tôi có sử dụng phương thức setContent của đối tượng Message để thay đổi phản hồi JSON không? Tham số định dạng trong trường hợp đó, chỉ là String.class là gì?

Trả lời

8

Trả lời câu hỏi của riêng tôi ở đây ... Tôi đã kết thúc bằng cách sử dụng bộ lọc JAX-RS, và nó hoạt động tốt, một khi tôi đã vượt qua việc thiếu tài liệu. Tôi đã sử dụng tài liệu (thay vì thưa thớt) từ http://cxf.apache.org/docs/jax-rs-filters.html. Lưu ý mặc dù tên của nó, một bộ lọc JAX-RS là một con thú đặc trưng CXF, không phải là một phần của tiêu chuẩn JAX-RS (theo như tôi có thể nói).

Dưới đây là một số mã ví dụ:

@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(); 
    } 
} 

Tôi nên lưu ý rằng việc thực hiện MyOutputStreamWrapper là một phần quan trọng trong việc sửa đổi các nội dung trả lời. Tôi không thể bao gồm nguồn đó ở đây (trên thực tế việc triển khai của tôi có một tên khác) do các cân nhắc về bảo mật.

+2

Sẽ rất tuyệt nếu bạn có thể giải thích lý do đằng sau việc lựa chọn của mình. – andthereitgoes

+0

tôi có cùng một câu hỏi, nếu CXF đã cung cấp máy đánh chặn, tại sao vẫn cần phải có bộ lọc? – Chailie

+3

@Chailie - không có lý do chính đáng để đi với bộ lọc JAX-RS trên CXF Interceptor, tôi nghĩ lý do chính tôi chọn là JAX-RS cụ thể, nhưng một thiết bị đánh chặn CXF cũng đã hoạt động. Lưu ý rằng JAX-RS 2.0 đã hết, vì vậy các bộ lọc và bộ chặn JAX-RS đã trở thành một phần của thông số kỹ thuật và chắc chắn sẽ là cách đi cùng với hiện tại Công nghệ. –

Các vấn đề liên quan