2013-05-01 26 views
8

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

<% response.setContentType("application/x-java-jnlp-file"); %> 
<%= "<?xml version=\"1.0\" encoding=\"utf-8\"?>" %> 
<!-- JNLP File for SimpleTableDemo --> 
<% 
String baseURL = request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath()); 
%> 
<jnlp codebase="<%=baseURL%>"> 

    <information> 
     <title>Simple Table Demo Application</title> 
     <vendor>Try</vendor> 
     <description>SimpleTableDemo</description> 
     <description kind="short">An application that demonstrates a simple table.</description> 
    </information> 

    <resources> 
     <j2se version="1.6+" /> 
     <property name="sid" value="<%=request.getSession().getId()%>" /> 
     <property name="serviceHost" value="<%=request.getServerName()%>"/> 
     <property name="servicePort" value="<%=request.getServerPort()%>"/> 
     <jar href="AuthenticateJNLPJars.jar;JSESSIONID=<%=request.getSession().getId()%>" /> 
    </resources> 

    <application-desc main-class="SimpleTableDemo" > 
    </application-desc> 
</jnlp> 

उत्तर

1

क्योंकि आप JSP के साथ अपने JNPL आप अपने एप्लेट के लिए कुछ सुरक्षा टोकन या सत्र आईडी के साथ एक बहस पारित कर सकते हैं बनानी होगी, फिर उस एप्लेट मान पास करना होगा जब सर्वर से अनुरोध जानकारी।

चेक करें: Generate JNLP dynamically

+1

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

0

आप वास्तव में करीब हैं !, लेकिन अपने सुरक्षा परत अधिक घटकों की जरूरत है।

कुंजी बेसURL चर है, एप्लेट द्वारा आवश्यक फ़ाइलों के जवाब देने के बजाय सर्वलेट को इंगित करने के लिए एक यूआरएल बनाएं, और सुरक्षा टोकन या टिकट में संलग्न करें। इस तरह:

/codebaseServlet/ABC123123 

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

की जांच: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/applet/codebase_determination.html

+0

प्रत्येक अनुरोधित यूआरएल के लिए प्रमाणीकरण हमारे नियंत्रण में नहीं है, सुझाए गए तंत्र में आप कह रहे हैं कि किसी भी तरह से हम यूआरएल में सुरक्षा टोकन का सम्मान करने के लिए हमारे सर्वलेट को संशोधित करते हैं लेकिन उत्पादन पर्यावरण प्रमाणीकरण में कार्यान्वयन में अपाचे वेब सर्वर में कस्टम परत के माध्यम से हो रहा है और एक भी अनुरोध प्रमाणीकरण के बिना टोमकैट तक नहीं पहुंच सकता है। इसलिए, संक्षेप में यदि सुरक्षा टोकन मानक तरीके से अग्रेषित नहीं किया जाता है क्योंकि यह ब्राउज़र में होता है तो अनुरोध सर्वलेट तक नहीं पहुंचता है। क्या सर्वर से जार का अनुरोध करते समय हम जावा वेब सुरक्षा सुरक्षा टोकन का उपयोग शुरू करने के बारे में बता सकते हैं? – Stauz

+0

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

3

मैं अब है (कुछ) जवाब ....

मुझे एहसास है कि यह प्रश्न एक वर्ष पुराना है, लेकिन चूंकि इस मुद्दे की खोज करते समय Google पर इसका पहला परिणाम है, मुझे लगा कि इसे पूरा करना एक अच्छा विचार था।

आपके द्वारा प्रदान किए गए जेएनएलपी कोड के साथ एक समस्या है, लेकिन सबसे पहले, आपको यह जांचना होगा कि यूआरएल में कुकी जोड़ने से वास्तव में काम होगा ..... और यह आपके ऐप परिनियोजन कॉन्फ़िगरेशन पर निर्भर करता है।

मैं नहीं जानता कि यह कैसे बिलाव पर है ... मैं weblogic उपयोग कर रहा हूँ, और उस में आप निम्नलिखित संपत्ति weblogic.xml में जाँच करने के लिए है

<session-descriptor> 
     <url-rewriting-enabled>true</url-rewriting-enabled> 
</session-descriptor> 

इसका मतलब है कि, यदि उपलब्ध है, weblogic यूआरएल से सत्र आईडी (आपके कोड में आपके पास उसी प्रारूप का उपयोग करके)

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

अब, यदि यूआरएल-रीराइटिंग-सक्षम सत्य है, तो यह दृष्टिकोण आपकी स्क्रिप्ट में निम्न समस्या को ठीक करने के बाद काम करेगा।

समस्या यह है कि, जब जावा वेब प्रारंभ ब्राउज़र से jnlp प्राप्त हो जाता है, तो यह इसे सर्वर से फिर से डाउनलोड करेगा, इसलिए आपको यह सुनिश्चित करना होगा कि आप उस अनुरोध में सत्र आईडी भी जोड़ दें।आपको लगता है कि इस तरह प्रारंभिक टैग modifiing से कार्य करें:

<jnlp spec="1.0+" codebase="<%=baseURL%>" href="<%=NAME_OF_JNLP%>;JSESSIONID=<%=SESSION_ID%>"> 

और वह यह है, कोड काम करना चाहिए ...

वैसे, गुण है कि आप कहा:

<property name="sid" value="<%=request.getSession().getId()%>" /> 
<property name="serviceHost" value="<%=request.getServerName()%>"/> 
<property name="servicePort" value="<%=request.getServerPort()%>"/> 

इसके लिए प्रासंगिक नहीं हैं, आप उन्हें हटा सकते हैं और कोड अभी भी काम करेगा।

2

(मैं एक टिप्पणी जोड़ने के लिए पर्याप्त विशेषाधिकार नहीं हैं, तो मैं एक अलग जवाब के रूप में इस डाल रहा हूं।)

Argod लिखा है:

समस्या

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

<jnlp spec="1.0+" codebase="<%=baseURL%>" href="<%=NAME_OF_JNLP%>;JSESSIONID=<%=SESSION_ID%>"> 

Argod,, आप वास्तव में JWS सर्वर से फिर से jnlp फ़ाइल डाउनलोड करने के लिए करते हैं: आपको लगता है कि इस तरह प्रारंभिक टैग modifiing से करना ।

Unofficial Java Web Start/JNLP FAQ देखें। यहां यह है कि यह कहता है:

एक चाल यह सुनिश्चित करना है कि जेएनएलपी फ़ाइल में href विशेषता शामिल न करें कि आपका सर्वलेट वेब स्टार्ट पर वापस भेजता है। यह जेएनएलपी फाइलों पर अद्यतन जांच को अक्षम करने के लिए वेब स्टार्ट को बताएगा, और वेब स्टार्ट प्रत्येक नई जेएनएलपी फ़ाइल को एप्लिकेशन अपडेट के रूप में नहीं मानेंगे - केवल अपडेट की गई जार फाइलें ही होंगी।

मैंने अभी इसे स्थानीय रूप से चेक किया है। href विशेषता के साथ, jnlp फ़ाइल वास्तव में तीन बार डाउनलोड हो जाती है, और जार फ़ाइल एक बार डाउनलोड हो जाती है। मेरे टॉमकैट लॉग देखें:

127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=342082FEA657D765699EADAF5486E9A7 HTTP/1.1" 200 741 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jar;JSESSIONID=342082FEA657D765699EADAF5486E9A7 HTTP/1.1" 200 7555 

ध्यान दें कि अंत में एक नया JSESSIONID कैसे सौंपा गया है, जो खराब है। दूसरी ओर, कोई href विशेषता के साथ, jnlp फ़ाइल एक बार डाउनलोड हो जाता है, और जार फ़ाइल एक बार डाउनलोड हो जाता है, और jsessionid संरक्षित है:

127.0.0.1 ... "GET /my-servlet/jws/myjws.jnlp;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 672 
127.0.0.1 ... "GET /my-servlet/jws/myjws.jar;JSESSIONID=58080491243456B6A653682FA0A3A738 HTTP/1.1" 200 7555 

ब्याज का एक और मुद्दा, "sid" की तरह है कि prorerty नाम है , "सर्विसहोस्ट", "सर्विसपोर्ट" (जैसे ओपी इस्तेमाल किया गया) जेडब्ल्यूएस द्वारा खारिज कर दिया जाएगा।

<property name="sid" value="<%=request.getSession().getId()%>" /> 
<property name="serviceHost" value="<%=request.getServerName()%>"/> 
<property name="servicePort" value="<%=request.getServerPort()%>"/> 

फिर से, Unofficial Java Web Start/JNLP FAQ देखें। यहां यह है कि यह कहता है:

यदि आप संपत्ति "विश्वसनीय" है तो आप केवल एक्सएमएल स्टार्टअप फ़ाइल में अविश्वसनीय/हस्ताक्षरित ऐप्स के लिए गुण सेट कर सकते हैं। वर्तमान में भरोसा गुण शामिल हैं:

  • javaws *
  • jnlp *
  • javax.swing।।।defaultlf
  • sun.java2d.noddraw

दूसरे शब्दों में, यदि आप javaws से अपने ऐप्लिकेशन का उपसर्ग यह करने के लिए अपनी खुद की संपत्ति पास करना चाहते हैं, उदाहरण के लिए, javaws.myproperty बजाय myproperty का उपयोग करें।

वही वास्तव में विश्वसनीय/हस्ताक्षरित जेडब्ल्यूएस अनुप्रयोगों पर लागू होता है।

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