2013-01-31 16 views
6

यह स्टैक ओवरफ़्लो में मेरा पहला प्रश्न है, इसलिए मुझे उम्मीद है कि यह बहुत आसान नहीं होगा। मैं एक अच्छे समाधान के लिए इंटरनेट के आसपास देख रहा हूं लेकिन अब तक मेरे पास यह नहीं है।किसी अन्य सर्वर में स्थित दूरस्थ ईजेबी तक पहुंचने का आसान तरीका

मैं आम तौर पर ईजेबी, जेएनडीआई और जावा ईई दुनिया के लिए बहुत ही भिक्षावान हूं, लेकिन पिछले महीनों में मैं इस माहौल में कुछ स्वीकार्य चीजें करने में सक्षम हूं। अब मैं काम पर एक समस्या पर ध्यान केंद्रित कर रहा हूं और अब तक समाधान उतना अच्छा नहीं है जितना मैं चाहूंगा।

परिदृश्य यह है: मेरे पास ग्लासफ़ीह 3.1.2 में एक ईएआर एप्लिकेशन चल रहा है। मैंने ईएआरबी को इस ईएआर ऐप के भीतर एक दूरस्थ इंटरफेस के माध्यम से स्टेटलेस बीन्स की पेशकश विधियों के साथ घोषित किया है।

यह मेरा रिमोट बीन उदाहरण के लिए, एक सर्वर server1 कहा जाता है में चल रहा

package com.booreg; 

import javax.ejb.LocalBean; 
import javax.ejb.Stateless; 

import com.booreg.IMyRemoteBean; 

@Stateless 
@LocalBean 
public class MyRemoteBean implements IMyRemoteBean 
{ 
    @Override 
    public String helloWorld() 
    { 
     return "Hi what's up boy"; 
    } 
} 

इस के लिए यह

package com.booreg; 

import javax.ejb.Remote; 

@Remote 
public interface IMyRemoteBean 
{ 
    public String helloWorld(); 
} 

तो मुझे लगता है कि लाजि़मी चलाना चाहिए एक दूसरे EAR एप्लिकेशन है, इंटरफ़ेस है किसी अन्य सर्वर पर, जिसे सर्वर 2 कहा जाता है। दूसरा एपीपी जेएसएफ और प्रबंधित बीन्स का उपयोग कर रहा है। हम एक प्रबंधित बीन MyRemoteBeanRemote के दूरदराज के एक ग्राहक के रूप में अभिनय किया है, यह के रूप में:

package com.nucleus; 

import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import com.booreg.IMyRemoteBean; 

@ManagedBean 
@ViewScoped 
public class MyManagedBean 
{ 
    @EJB(name="TheRef") IMyRemoteBean myRemoteBean; 

    public String getPhrase() { return myRemoteBean.helloWorld(); } 
} 

मैं मुद्दा यह है कि इस में एक EJB-रेफरी के अंदर वेब-INF/धूप में web.xml फ़ाइल घोषित करने से काम करता है के लिए आ गया है मेरी वेब परियोजना।

<ejb-ref> 
    <ejb-ref-name>TheRef</ejb-ref-name> 
    <jndi-name>corbaname:iiop:server1:3700#java:global/booreg/booreg.ejb/MyRemoteBean!com.booreg.IMyRemoteBean</jndi-name> 
</ejb-ref> 

मैं समझता हूँ कि इस धूप में web.xml फ़ाइल के साथ JNDI-नाम पता जहां EJB पहली बार एप्लिकेशन पर स्थित कार्यान्वयन पता लगाने के लिए करने के लिए दूसरे एप्लिकेशन बनाता है। लेकिन यहां मेरे कुछ प्रश्न हैं:

  1. मेरे प्रोजेक्ट में मेरे प्रत्येक ईजेबी इंटरफ़ेस के लिए एक ईजेबी-रेफरी प्रविष्टि घोषित करना आवश्यक है?
  2. मैं सूर्य-web.xml के अंदर सर्वर/पोर्ट (सर्वर 1: 3700 विकास के दौरान) के लिए स्थिर संदर्भ बनाने से कैसे बच सकता हूं? जब यह उत्पादन में जाएगा तो मुझे प्रत्येक के लिए मैन्युअल रूप से अलग नाम बदलना होगा ?? यह विचित्र लगता है। क्या मैं सर्वर/पोर्ट निर्दिष्ट करने के लिए सर्वर पक्ष पर किसी प्रकार का चर का उपयोग कर सकता हूं?

मुझे उम्मीद है कि मैंने खुद को काफी समझाया है।

बहुत धन्यवाद

अद्यतन: अंत में, इस link मुझे लगता है कि EJB सर्वर (server1) मेरी classpath के अंदर एक jndi.properties फ़ाइल बनाने के लिए संदर्भ बनाने के लिए संभव है करने के लिए धन्यवाद। इस फ़ाइल में इस तरह की रेखाएं होनी चाहिए।

java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory 
java.naming.factory.url.pkgs=com.sun.enterprise.naming 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl 
org.omg.CORBA.ORBInitialHost=server1 
org.omg.CORBA.ORBInitialPort=3700 

लेकिन मुझे अभी भी समस्याएं आ रही हैं। एप्लिकेशन को तैनात करते समय सर्वर 1 पर अगला अपवाद दिखाई देता है, मैं एप्लिकेशन को तैनात नहीं कर सकता।

ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable 
org.omg.CORBA.BAD_PARAM: ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable vmcid: SUN minor code: 6 completed: Maybe 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248) 
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95) 
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387) 
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107) 
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511) 
    at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99) 
    at $Proxy117.notSerializable(Unknown Source) 
    at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:783) 
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:697) 
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:545) 
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:493) 
    ... 

किसी को भी कोई विचार है?

+0

यदि आप रिमोट ejb को jndi के माध्यम से कोड में देखते हैं तो आप पोर्ट और सर्वर के लिए सर्वर जेवीएम चर का उपयोग कर सकते हैं। शायद सूर्य-web.xml के भीतर जेवीएम चर का उपयोग करना संभव है। मुझे नहीं पता कि यह संभव है या नहीं। – djmj

+0

मुझे कोड को यथासंभव स्वच्छ और सरल रखना पसंद है। इस कारण से मैं अपने कोड के अंदर लुकअप का उपयोग करना पसंद नहीं करता जहां @EJB काम को आसान बनाता है। – dgisbert

+0

क्या आपने क्लस्टर में दो उदाहरणों का आयोजन करने पर विचार किया है? – gcvt

उत्तर

0

@dgisbert

अंतिम टिप्पणी आप का उल्लेख किया है, कि एक सर्वर एक सार्वजनिक और अन्य एक है अपने उद्यम के आंतरिक सर्वर है। अच्छी तरह से एक सार्वजनिक सर्वर से अनुप्रयोग परत बुलाओ सबसे अच्छा अभ्यास नहीं है। इसका मतलब है कि आप सीधे अपनी महत्वपूर्ण व्यावसायिक परत तक पहुंच प्रदान कर रहे हैं। मैं आपके ईजेबी कॉल के शीर्ष पर एक वेब सेवा परत रखने का सुझाव दूंगा ताकि सार्वजनिक साइट से प्रत्येक कॉल को वेबसेवर -> ऐप सर्वर के माध्यम से आना पड़े। इस तरह आप हमले के खतरे को कम कर सकते हैं

+0

उत्तर के लिए धन्यवाद, लेकिन मुझे ऐसा कारण नहीं दिख रहा है जो कि मध्यवर्ती वेब-सेवा परत के बजाय बेहतर है रिमोट ईजेबी कॉल है। रिमोट ईजेबी कॉल के माध्यम से मैं नियंत्रित कर रहा हूं कि मेरे एप्लिकेशन के कौन से हिस्से रिमोट इंटरफ़ेस के माध्यम से दूरस्थ रूप से दिखाई दे रहे हैं। – dgisbert

+1

@dgisbert - यह आपके बारे में नहीं है कि आप किस सेवा का पर्दाफाश करते हैं - यह आपके पार्टनर बिजनेस लेयर को बाहरी पार्टियों तक सीधे पहुंच प्रदान करने के बारे में है। विशिष्ट वास्तुशिल्प सुझावों में बाहरी और आंतरिक प्रणालियों के बीच एक डीएमजेड परत होगी (ftp.software.ibm.com/ सॉफ़्टवेयर/तर्कसंगत/वेब/श्वेतपत्र/r_wp_securityrichwebapps.pdf) .. Securing_Enterprise_Web_Applications_at_the_Source के लिए Google/Bing खोज। यह एक लंबा दस्तावेज है लेकिन इसे पढ़ने के लिए समय लगता है। एक हैकर (जीनियस लोग?) इस भेद्यता का फायदा उठा सकते हैं और अपनी परत पर हमला कर सकते हैं। वे नए दृष्टिकोणों के साथ आते रहते हैं – user1428716

+0

आपकी टिप्पणियों के लिए धन्यवाद। मैं सुरक्षा विशेषज्ञ नहीं हूं, लेकिन मैं सुरक्षा के बारे में चिंतित हूं। मैंने आपके द्वारा उल्लेख किए गए दस्तावेज़ को डाउनलोड किया है। यह लंबा है, लेकिन मैं एक नज़र डालेगा। डीएमजेड के बारे में, हमारे पास पहले से ही डीएमजेड में सर्वर 1 है। इसलिए, हम फ़ायरवॉल के माध्यम से server1 और server2 के बीच सभी ट्रैफ़िक को नियंत्रित कर सकते हैं। मैंने इसे सार्वजनिक कहा क्योंकि हम सर्वर 1 पर वेब कनेक्शन की अनुमति देते हैं (बेशक हमारे पेज पासवर्ड-सुरक्षित हैं) और सर्वर 1 और सर्वर 2 के बीच हम केवल दूरस्थ ईजेबी कॉल की अनुमति देते हैं। इसलिए, आईएमएचओ वेब सेवा लेयर बीवेन सर्वर 1 और सर्वर 2 के समान है जिसमें रिमोट ईजेबी सेवा परत है। – dgisbert

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

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