2012-02-07 13 views
10

हमने अपाचे सीएक्सएफ का उपयोग करके कुछ आरईएसटी (जैक्स-आरएस) वेब सेवाओं का निर्माण किया है। वे एक JSON प्रतिक्रिया वापस करते हैं।सर्वलेट फ़िल्टर बनाम सीएक्सएफ इंटरसेप्टर?

अब मुझे कुछ अनुरोध पैरामीटर और प्रतिक्रिया सामग्री को संशोधित करने की आवश्यकता है। (मूल रूप से हमें सेवा द्वारा लौटाए गए कुछ डेटा को एन्कोड/एन्क्रिप्ट करना होगा; और बाद में सेवा कॉल में पैरामीटर के रूप में उपयोग किए जाने पर उसी डेटा को डीकोड/डिक्रिप्ट करना होगा।)

ऐसा लगता है कि मेरे पास कम से कम है यहाँ 4 विकल्प:

  1. एक सर्वलेट फिल्टर
  2. उपयोग एक CXF इंटरसेप्टर
  3. उपयोग का प्रयोग करें एक JAX-आरएस फ़िल्टर
  4. किसी विशेष पैटर्न का उपयोग न करें, और वास्तविक भीतर एनकोड/डीकोड प्रदर्शन सेवा तर्क

मैंने पहले सर्वलेट फ़िल्टर का उपयोग किया है, और वास्तव में अनुरोध पैरा और प्रतिक्रिया निकाय को संशोधित करने के तरीके को समझते हैं, इसलिए मैं इसके प्रति झुका रहा हूं। हालांकि, मैं सीएक्सएफ इंटरसेप्टर या जेएक्स-आरएस फ़िल्टर का उपयोग करने के लिए खुला हूं अगर सीएक्सएफ का उपयोग करते समय इसे हल करने के लिए यह 'सही' तरीका है। लेकिन प्रलेखन के आधार पर, मुझे यह करने के लिए वास्तव में समझ में नहीं आता है। उदाहरण के लिए, क्या मैं JSON प्रतिक्रिया को बदलने के लिए संदेश ऑब्जेक्ट की setContent विधि का उपयोग करता हूं? उस मामले में प्रारूप पैरामीटर क्या है, बस String.class?

उत्तर

8

यहां अपने स्वयं के प्रश्न का उत्तर दे रहा है ... मैं एक जेएक्स-आरएस फ़िल्टर का उपयोग कर समाप्त हुआ, और दस्तावेज की कमी से पहले एक बार यह अच्छा काम करता था। मैंने http://cxf.apache.org/docs/jax-rs-filters.html से (बल्कि स्पैस) दस्तावेज का उपयोग किया। नोट के नाम के बावजूद, एक जेएक्स-आरएस फ़िल्टर एक सीएक्सएफ-विशिष्ट जानवर है, जो जेएक्स-आरएस मानक का हिस्सा नहीं है (जहां तक ​​मैं कह सकता हूं)।

@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 के कार्यान्वयन प्रतिक्रिया सामग्री को संशोधित करने में महत्वपूर्ण हिस्सा है:

यहाँ कुछ उदाहरण कोड है। सुरक्षा विचारों के कारण मैं उस स्रोत को यहां शामिल नहीं कर सका (वास्तव में मेरे कार्यान्वयन का एक अलग नाम है)।

+2

यह अच्छा होगा अगर आप अपनी पसंद के पीछे कारण बता सकते हैं। – andthereitgoes

+0

मेरे पास एक ही सवाल है, अगर सीएक्सएफ ने इंटरसेप्टर प्रदान किया है, तो अभी भी फ़िल्टर क्यों होना चाहिए? – Chailie

+3

@ चाइली - सीएक्सएफ इंटरसेप्टर पर जेएक्स-आरएस फ़िल्टर के साथ जाने का कोई मजबूत कारण नहीं था, मुझे लगता है कि मैंने इसे चुना मुख्य कारण यह था कि यह जेएक्स-आरएस विशिष्ट था, लेकिन एक सीएक्सएफ इंटरसेप्टर भी काम करता। (हालांकि इसे अभी भी कस्टम कोडिंग की एक ही राशि की आवश्यकता होगी।) ध्यान दें कि जेएक्स-आरएस 2.0 अब बाहर है, इसलिए जेएक्स-आरएस फ़िल्टर और इंटरसेप्टर spec का हिस्सा बन गए हैं और निश्चित रूप से वर्तमान के साथ जाने का तरीका होगा प्रौद्योगिकी। –

संबंधित मुद्दे