Apache CXF এ Interceptors ব্যবহৃত হয় SOAP ও RESTful ওয়েব সার্ভিসের চলাচল প্রক্রিয়া কাস্টমাইজ এবং প্রসেস করার জন্য। Interceptors সাধারণত সার্ভিসের ইনপুট এবং আউটপুট স্ট্রিমকে প্রসেস করতে, লগিং, নিরাপত্তা, ট্রান্সফরমেশন, অডিটিং ইত্যাদি উদ্দেশ্যে ব্যবহৃত হয়।
CXF তে Custom Interceptors তৈরি করে আপনি সার্ভিসের বিভিন্ন স্তরের কার্যক্রমকে নিয়ন্ত্রণ করতে পারবেন, যেমন SOAP মেসেজ প্রক্রিয়াকরণ, লগিং, কিংবা অডিটিং, যা সার্ভিসের আচরণ বা ফ্লো ট্র্যাক করতে সাহায্য করে।
Interceptor হল একটি কাস্টম ক্লাস যা CXF এর মেসেজের লাইফসাইকেল কন্ট্রোল করে, এবং এটি দুই ধরনের হতে পারে:
এছাড়া, Phase এর মাধ্যমে আপনি কনফিগার করতে পারেন কখন এই Interceptors কার্যকর হবে। সাধারণত PRE_PROTOCOL, POST_PROTOCOL, SEND, RECEIVE ইত্যাদি ফেজ ব্যবহার করা হয়।
আপনার প্রয়োজন অনুযায়ী InInterceptor বা OutInterceptor তৈরি করতে পারেন। এখানে একটি কাস্টম OutInterceptor তৈরি করার উদাহরণ দেওয়া হলো যা লগিংয়ের জন্য ব্যবহৃত হবে।
import org.apache.cxf.interceptor.OutInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.message.MessageContentsList;
import java.util.logging.Logger;
public class LoggingInterceptor extends OutInterceptor {
private static final Logger LOGGER = Logger.getLogger(LoggingInterceptor.class.getName());
public LoggingInterceptor() {
// Set phase to send after protocol phase
super(Phase.POST_PROTOCOL);
}
@Override
public void handleMessage(Message message) {
if (message != null) {
// Get the outgoing message content (response)
MessageContentsList contents = (MessageContentsList) message.getContent(MessageContentsList.class);
String xml = XMLUtils.toString(contents.get(0)); // Convert the response to a string
LOGGER.info("Outgoing message: " + xml); // Log the response message
}
}
}
এখানে:
এছাড়া, আপনি যদি ইনপুট মেসেজ (request) ইন্টারসেপ্ট করতে চান, তাহলে InInterceptor তৈরি করতে পারেন:
import org.apache.cxf.interceptor.InInterceptor;
import org.apache.cxf.message.Message;
import java.util.logging.Logger;
public class RequestLoggingInterceptor extends InInterceptor {
private static final Logger LOGGER = Logger.getLogger(RequestLoggingInterceptor.class.getName());
public RequestLoggingInterceptor() {
// Set phase to receive
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) {
if (message != null) {
String request = message.toString(); // Get the incoming message as string
LOGGER.info("Incoming message: " + request); // Log the incoming message
}
}
}
এখানে:
এখন, আপনাকে Spring বা Java Config ব্যবহার করে এই Custom Interceptors গুলোকে CXF সার্ভিসে কনফিগার করতে হবে।
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Add custom Interceptors -->
<bean id="loggingInterceptor" class="com.example.interceptor.LoggingInterceptor" />
<bean id="requestLoggingInterceptor" class="com.example.interceptor.RequestLoggingInterceptor" />
<!-- CXF Bean Configuration -->
<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus" />
<!-- Add the Interceptors to the CXF Bus -->
<bean id="server" class="org.apache.cxf.jaxws.EndpointImpl">
<property name="service" ref="helloWorldService"/>
<property name="address" value="/helloWorld"/>
<property name="inInterceptors">
<list>
<ref bean="requestLoggingInterceptor"/>
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="loggingInterceptor"/>
</list>
</property>
</bean>
</beans>
এখানে:
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.bus.spring.SpringBus;
@Configuration
public class CxfConfig {
@Bean
public LoggingInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
@Bean
public RequestLoggingInterceptor requestLoggingInterceptor() {
return new RequestLoggingInterceptor();
}
@Bean
public Server cxfServer(SpringBus cxf, HelloWorldService helloWorldService) {
EndpointImpl endpoint = new EndpointImpl(cxf, helloWorldService);
endpoint.getInInterceptors().add(requestLoggingInterceptor());
endpoint.getOutInterceptors().add(loggingInterceptor());
endpoint.publish("/helloWorld");
return endpoint;
}
}
এখানে:
কাস্টম ইন্টারসেপ্টর ব্যবহারের মাধ্যমে আপনি লগিং বা অডিটিং প্রক্রিয়াকে আরও উন্নত করতে পারেন। যেমন:
এই ধরনের কাস্টম ইন্টারসেপ্টরগুলো আপনার অ্যাপ্লিকেশনের API Monitoring, Debugging, এবং Compliance কার্যক্রমকে আরও সহজ ও কার্যকর করতে সাহায্য করে।
এভাবে, আপনি Apache CXF এ Custom Interceptors তৈরি এবং লগিং বা অডিটিংয়ের জন্য ব্যবহার করতে পারেন, যা ওয়েব সার্ভিসের কার্যকারিতা বাড়াতে সহায়ক হবে।