2012-06-08 16 views
22

मैं यह जानने का प्रयास कर रहा हूं कि URL में एकाधिक पैरामीटर कैसे पास करें। मैं अपने एंड्रॉइड क्लास से जावा सर्वलेट में अक्षांश और देशांतर पारित करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?मैं यूआरएल में एकाधिक पैरामीटर कैसे पास करूं?

URL url; 
double lat=touchedPoint.getLatitudeE6()/1E6; 
double lon=touchedPoint.getLongitudeE6()/1E6; 
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+lon); 

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

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+" "+lon); 
output- Nothing is written to file 
     url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&?param2="+lon); 
output- 28.534386 (Only Latitude) 
     url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"?param2="+lon); 
output- 28.532577?param2=77.502996 

मेरे सर्वलेट कोड इस प्रकार है:

req.setCharacterEncoding("UTF-8"); 
resp.setCharacterEncoding("UTF-8"); 
final String par1 = req.getParameter("param1"); 
final String par2 = req.getParameter("param2"); 
FileWriter fstream = new FileWriter("C:\\Users\\Hitchhiker\\Desktop\\out2.txt"); 
BufferedWriter out = new BufferedWriter(fstream); 
out.write(par1); 
out.append(par2); 
out.close(); 

इसके अलावा, मैं चाहता था करने के लिए पता है कि यह सबसे सुरक्षित और सुरक्षित तरीका Android डिवाइस से सर्वर से डेटा पास करने के लिए है।

+0

होना चाहिए 'और के बजाय' param2' – xandy

उत्तर

44

यह

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&param2="+lon); 

काम करना चाहिए। किसी भी अजीब कारण के लिए , आपको पहले पैरामीटर से पहले ? और & से पहले निम्नलिखित की आवश्यकता है।

तरह

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"_"+lon); 

एक यौगिक पैरामीटर का उपयोग काम करेगा, भी, लेकिन निश्चित रूप से अच्छा नहीं है। आप वहां एक स्थान का उपयोग नहीं कर सकते क्योंकि यह किसी यूआरएल में निषिद्ध है, लेकिन आप इसे %20 या + (लेकिन यह भी बदतर शैली है) के रूप में एन्कोड कर सकते हैं।


1 उन्होंने कहा कि ? पथ और मानकों को अलग करती है और कि & अलग करती है एक दूसरे से मानकों कारण के बारे में कुछ भी स्पष्ट नहीं होता। कुछ आरएफसी कहते हैं, "वहां उपयोग करें और & वहां", लेकिन मैं नहीं देख सकता कि उन्होंने एक ही चरित्र का चयन क्यों नहीं किया।

+0

धन्यवाद param2', एक आकर्षण की तरह काम किया:

संबंधित एसई सवाल पर एक नज़र डालें। :) क्या आप कृपया मेरे आखिरी प्रश्न का उत्तर भी दे सकते हैं कि ऐसा करने का यह सबसे सुरक्षित तरीका है? जिस एप्लिकेशन को मैं विकसित कर रहा हूं वह बाजार पर तैनात किया जा रहा है, इसलिए यह आवश्यक है कि यह सुरक्षित हो। – rishiag

+0

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

+3

यह एक अजीब कारण नहीं है। '?' क्वेरी स्ट्रिंग का हिस्सा नहीं है। यह अनुरोध यूआरआई और अनुरोध क्वेरी स्ट्रिंग के बीच केवल विभाजक चरित्र है। बदले में क्वेरी स्ट्रिंग पैरामीटर जोड़े को '& 'को विभाजक चरित्र के रूप में चाहिए। बदले में क्वेरी स्ट्रिंग पैरामीटर नाम और मान जोड़ी को '=' को विभाजक चरित्र के रूप में चाहिए। क्वेरी स्ट्रिंग्स में रिक्त स्थान को '+ 'के रूप में एन्कोड किया जाना चाहिए। '% 20' केवल अनुरोध यूआरआई भाग पर लागू है। क्वेरी स्ट्रिंग घटकों को एन्कोड करने के लिए आप 'URLEncoder # एन्कोड() 'का उपयोग कर सकते हैं। यह भी देखें http://stackoverflow.com/questions/2793150/ – BalusC

3

मुझे जावा के बारे में बहुत कुछ पता नहीं है लेकिन यूआरएल क्वेरी तर्कों को "&" से अलग किया जाना चाहिए, नहीं? "

http://tools.ietf.org/html/rfc3986 कीवर्ड के रूप में "सब-डेलीम" का उपयोग करके संदर्भ के लिए अच्छी जगह है। http://en.wikipedia.org/wiki/Query_string एक और अच्छा स्रोत है।

0

आप के रूप में "?param1=value1&param2=value2"

से अधिक पैरामीटर पारित कर सकते हैं लेकिन यह सुरक्षित नहीं है। यह Cross Site Scripting (XSS) Attack के लिए कमजोर है।

आपका पैरामीटर बस एक स्क्रिप्ट के साथ बदला जा सकता है।

इस article और article

पर एक नज़र डालें आप इसे StringEscapeUtils

static String escapeHtml(String str) 
      Escapes the characters in a String using HTML entities. 

के एपीआई का उपयोग कर यहां तक ​​कि इसके बाद के संस्करण सावधानियों के बिना सुरक्षा के लिए https यूआरएल का उपयोग करके सुरक्षित कर सकते हैं एक अच्छा अभ्यास नहीं है।

Is URLEncoder.encode(string, "UTF-8") a poor validation?

+0

मुझे 'स्ट्रिंगएस्केप यूटिल्स' में कुछ भी दिखाई नहीं देता है जो यूआरएल पैरामीटर को सही तरीके से एन्कोड करता है, और 'यूआरएलएनकोडर' पहले से मौजूद है। – EJP

+0

संबंधित एसई प्रश्न के साथ अद्यतन उत्तर। –

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