2013-02-19 28 views
7

मैं एक वेबगेम विकसित कर रहा हूं। खेल के हिस्से के रूप में, आप सुविधाओं के सीमित सेट के साथ शुरू करते हैं, और जब आप खेलते हैं तो आप उनमें से अधिक अनलॉक करते हैं।इस स्थिति के लिए क्या प्रतिक्रिया कोड उपयुक्त है?

उदाहरण के लिए, आप ट्यूटोरियल में चरण 3 के हिस्से के रूप में /fields अनलॉक करते हैं। लेकिन क्या होगा यदि आप पता बार में पर नेविगेट करते हैं?

मैं यह जानने की कोशिश कर रहा हूं कि प्रतिक्रिया देने के लिए सबसे अच्छा स्थिति कोड क्या होगा।

403 आदर्श लगता है क्योंकि उपयोगकर्ता को पृष्ठ तक पहुंचने से मना कर दिया जाता है जब तक कि वे इसे अनलॉक नहीं करते।
404 भी समझ में आता है क्योंकि पेज अनलॉक होने तक तकनीकी रूप से "अस्तित्व में नहीं है" और उपयोगकर्ताओं को उस पृष्ठ के बीच अंतर बताने में सक्षम होने से रोकता है जो अस्तित्व में नहीं है और एक जिसे उन्होंने अभी तक अनलॉक नहीं किया है।

लेकिन दोनों मामलों में मैंने कुछ उपयोगकर्ताओं को 403/404 परिणाम कैश करने वाले ब्राउज़र के साथ समस्याएं रिपोर्ट की हैं और उन्हें अनलॉक करने के बाद भी पृष्ठ तक पहुंचने की अनुमति नहीं दी है जब तक कि वे पूरी तरह से कैश को शुद्ध न करें।

मैं अगर मैं 403 या 404 का उपयोग कर रखना चाहिए सोच रहा हूँ, या मैं एक कस्टम statusText साथ एक अप्रयुक्त 4xx कोड जैसे 442 का उपयोग करना चाहिए, या यहाँ तक कि मजाक में चारों ओर poking एक उपयोगकर्ता के जवाब में HTTP/1.1 418 I'm A Teapot भेज जहां वे नहीं करना चाहिए हो।

मुझे एक अच्छा, ठोस कारण चाहिए कि दूसरों पर एक विकल्प का उपयोग क्यों किया जाना चाहिए।

+2

मुझे सही उत्तर नहीं पता है, लेकिन निम्न पोस्ट कुछ दिलचस्प तर्क प्रदान करता है: http://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unuthorized-http-responses – RobJohnson

+1

क्यों नहीं बस उस पृष्ठ पर रीडायरेक्ट करें जिस पर उन्हें अनुमति है? यह भी पॉप-अप कह सकता है कि यह सुविधा अभी तक उपलब्ध नहीं है। –

+2

वैसे, '401 अनधिकृत 'एक बुरा विचार होगा, क्योंकि यह स्थिति कोड केवल HTTP प्रमाणीकरण के लिए है और ब्राउज़र विशेष रूप से इस स्थिति कोड को संभालते हैं। – nalply

उत्तर

3

टीएल; डी409 Conflict एक विचार होगा, लेकिन शायद आपको कैशिंग के साथ समस्याएं हैं। इस मामले में एक रीलोड को मजबूर करने के लिए कैश-बस्टर काम करेगा।

लांग स्पष्टीकरण

शायद एक 409 Conflict स्थिति कोड होगा भावना:

10.4.10 409 संघर्ष

अनुरोध वर्तमान स्थिति से विरोध के कारण पूरा नहीं हो सका संसाधन का। यह कोड केवल उन परिस्थितियों में अनुमत है जहां यह अपेक्षा की जाती है कि उपयोगकर्ता संघर्ष को हल करने और अनुरोध को पुनः सबमिट करने में सक्षम हो सकता है। प्रतिक्रिया निकाय को उपयोगकर्ता के संघर्ष के स्रोत को पहचानने के लिए पर्याप्त जानकारी शामिल करनी चाहिए। आदर्श रूप में, प्रतिक्रिया इकाई में समस्या को ठीक करने के लिए उपयोगकर्ता या उपयोगकर्ता एजेंट के लिए पर्याप्त जानकारी शामिल होगी; हालांकि, यह संभव नहीं हो सकता है और इसकी आवश्यकता नहीं है।

पुट अनुरोध के जवाब में संघर्ष होने की संभावना अधिक है। उदाहरण के लिए, यदि वर्जनिंग का उपयोग किया जा रहा था और PUT में मौजूद इकाई को संसाधन में परिवर्तन शामिल किया गया था जो पहले (तृतीय-पक्ष) अनुरोध द्वारा किए गए लोगों के साथ संघर्ष करता है, तो सर्वर 40 9 प्रतिक्रिया का उपयोग कर सकता है यह इंगित करने के लिए कि यह अनुरोध पूरा नहीं कर सकता । इस मामले में, प्रतिक्रिया इकाई में प्रतिक्रिया सामग्री प्रकार द्वारा परिभाषित स्वरूप में दो संस्करणों के बीच मतभेदों की एक सूची होगी।

यह समझ में आता है, क्योंकि संसाधन केवल उपयोगकर्ता के ट्यूटोरियल के बाद ही उपलब्ध है। इससे पहले संसाधन एक «अमान्य» स्थिति में है। और उपयोगकर्ता ट्यूटोरियल को पूरा करके इस संघर्ष को हल करने में सक्षम है।

बाद में मैंने मामले को थोड़ा और जांच की और मुझे पता चला कि शैतान विस्तार से है। आइए 403 Forbidden और 404 Not Found के लिए विनिर्देश पढ़ें।

10.4.4 403

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

महत्वपूर्ण विनिर्देश कि «अनुरोध दोहराया नहीं जाना चाहिए» है। एक ब्राउज़र जो 403 पेज को फिर से अनुरोध नहीं करता है, वह सही काम कर सकता है। हालांकि, के 404 के साथ आगे बढ़ें:

10.4.5 404 Not Found

सर्वर कुछ भी अनुरोध- URI मिलान नहीं मिला है। कोई संकेत नहीं दिया गया है कि स्थिति अस्थायी या स्थायी है या नहीं।

[लोप]

अब हम एक समस्या है! यदि विनिर्देश उन्हें अस्थायी होने की अनुमति देता है तो आपके 404 पृष्ठों को कैश किया जाएगा?

शायद आपके सेटअप में आपके कैशिंग को आपके 403 और 404 पृष्ठों के लिए कॉन्फ़िगर नहीं किया गया है। यदि ऐसा है, तो कृपया this answer on StackOverflow से परामर्श लें। यह 4xx पृष्ठों को कैशिंग के बारे में विस्तृत उत्तर देता है।

आप कैशिंग हेडर के साथ गड़बड़ नहीं करना चाहते हैं, तो एक तथाकथित कैश-बस्टर का उपयोग करें और यह (अपने वेब भाषा के रूप में मानते हुए पीएचपी) की तरह प्रणाली समय व्यतीत:

<a href="/fields?<?php echo time(); ?>">

यह /fields?1361948122 जैसे यूआरएल उत्पन्न करता है, हर सेकेंड में वृद्धि करता है। यह मार्कस ए

द्वारा प्रस्तावित समाधान का एक रूप है। मुझे लगता है कि क्वेरीस्ट्रिंग 1361948122 आपके संसाधन द्वारा अनदेखा किया गया है। यदि ऐसा नहीं है, तो कैश-बस्टर को इसके बजाय क्वेरीस्ट्रिंग पैरामीटर में पास करें, उदाहरण के लिए t=1361948122 और सुनिश्चित करें कि पैरामीटर t का मूल्यांकन आपके संसाधन द्वारा नहीं किया जाता है।

2

HTTP त्रुटि कोड्स की इच्छित उद्देश्य के संदर्भ में, मैं निश्चित रूप से, 403 Forbidden साथ जाना, क्योंकि वह पृष्ठ मौजूद है जाएगा (404 बाहर है), लेकिन उपयोगकर्ता मना अब के लिए इसे उपयोग करने (और यह प्रतिबंध नहीं है एक संसाधन संघर्ष के कारण नहीं है, समवर्ती संशोधन की तरह, लेकिन उपयोगकर्ता की खाता स्थिति के कारण, यानी 40 9 मेरी राय में भी बाहर है)। इसके इरादे के उद्देश्य के आधार पर एक और समझदार विकल्प 401 हो सकता था, लेकिन जैसा कि नाली ने पहले ही अपनी टिप्पणी में नोट किया था, यह कोड कुछ लोगों को ट्रिगर करता है, यदि सभी नहीं, तो ब्राउज़र एक लॉगिन संवाद प्रदर्शित करने के लिए, जैसा कि इसका तात्पर्य है कि मानक वेब-प्रमाणीकरण तंत्र का उपयोग कर सकते हैं मामले को हल करो। तो, यह निश्चित रूप से यहां आपके लिए एक विकल्प नहीं होगा।

दो बातें एक छोटे से "misfitting" 403 के विवरण में लग रहे हैं, इसलिए मुझे उन्हें सुलझाने करते हैं:

  1. प्राधिकरण में मदद नहीं करेगा ...: यह HTTP के अंदर प्राधिकरण तंत्र के बारे में केवल वार्ता प्रोटोकॉल और 401 से 403 अंतर करने के लिए है।यह कथन कस्टम प्राधिकरण या सत्र राज्य प्रबंधन के किसी भी रूप पर लागू नहीं होता है।
  2. ... अनुरोध दोहराया नहीं जाना चाहिए ...: सत्र संदर्भ में हमेशा एक अनुरोध देखा जाना चाहिए, इसलिए यदि उपयोगकर्ता का सत्र संदर्भ बदलता है (वह एक सुविधा को अनलॉक करता है) और फिर वह उस तक पहुंचने के लिए पुनः प्रयास करता है एक ही संसाधन, यह एक अलग अनुरोध है, यानी इस सुझाव का कोई उल्लंघन नहीं है।
बेशक

, आप भी अपनी खुद की त्रुटि कोड निर्धारित कर सकते हैं, लेकिन जब से यह शायद कोई आधिकारिक तरह से आरक्षित नहीं किया जाएगा, वहाँ कोई गारंटी नहीं है कि कुछ ब्राउज़र निर्माता जानबूझकर या गलती से वास्तव में उपयोग करने के लिए नहीं जा रहा है है वह कोड एक विशिष्ट (डीबगिंग) क्रिया को ट्रिगर करने के लिए। यह असंभव है, लेकिन अस्वीकृत नहीं है।

418 हालांकि, ठीक भी हो सकता है। :)

बेशक, यदि आप विशेष रूप से सुविधाओं की संभावित उपलब्धता को अस्पष्ट करना चाहते हैं, तो आप 404 का उपयोग करने का भी निर्णय ले सकते हैं क्योंकि यह एकमात्र तरीका है जो किसी भी उपयोगकर्ता को कोई संकेत नहीं देता है।

अब, अपने कैशिंग मुद्दे पर:

न तो ये स्थिति कोड (403, 404, 409, 418) चाहिए ट्रिगर ब्राउज़र अपने किसी अन्य की तुलना में अधिक इच्छा के विरुद्ध पेज कैश करने के लिए में से एक। समस्या यह है कि कई ब्राउज़र पागल जैसे सब कुछ अतिरिक्त स्नैपी होने के लिए बस कोशिश करते हैं। मेरी राय में ओपेरा सबसे खराब है। मैं इन चीजों पर कई बार अपने बालों को खींच रहा हूं। इसे सही शीर्षलेख सेटिंग्स के साथ काम करना संभव होना चाहिए, लेकिन मेरे पास ऐसी स्थितियां थीं जहां ब्राउज़र या सर्वर या कुछ मध्यवर्ती प्रॉक्सी ने उन्हें अनदेखा करने और किसी भी तरह से अपना पृष्ठ तोड़ने का फैसला किया था।

एकमात्र निश्चित-अग्नि तरीका जिसे मैंने अभी तक पाया है कि पूरी तरह से एक रीलोड की गारंटी देता है, एक डमी अनुरोध पैरामीटर जैसे/फ़ील्ड? टी = 2 9 873, जहां 2 9 873 एक ऐसा नंबर है जो आपके द्वारा किए गए हर अनुरोध के लिए अद्वितीय है किसी भी संभावित समय के पैमाने के भीतर। सर्वर पर, ज़ाहिर है, तो आप बस इस पैरामीटर को अनदेखा कर सकते हैं। ध्यान दें कि केवल 1 से शुरू करने के लिए पर्याप्त नहीं है जब आपका उपयोगकर्ता पहले आपका पृष्ठ खोलता है और फिर निम्न अनुरोधों के लिए गिनती करता है, क्योंकि ब्राउज़र पृष्ठ-रीलोड में कैश रख सकते हैं।

मैं जावा (दोनों सर्वर और क्लाइंट साइड GWT का उपयोग) में अपने वेब विकास करते हैं और मैं इस कोड का उपयोग डमी "संख्या" उत्पन्न करने के लिए:

private static final char[] base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.".toCharArray(); 
private static int tagIndex = 0; 

/** 
* Generates a unique 6-character tag string that is guaranteed to not repeat 
* for about 400 days, if this function is, on average, not called more often 
* than twice every millisecond. 
* 
* @return the tag string 
*/ 
public static String nowTag() { 
    int tag = (int) ((System.currentTimeMillis() >>> 5)); // adjust 
    char[] result = new char[6]; 
    result[5] = base64chars[(tagIndex++) & 63]; 
    result[4] = base64chars[tag & 63]; 
    tag >>>= 6; 
    result[3] = base64chars[tag & 63]; 
    tag >>>= 6; 
    result[2] = base64chars[tag & 63]; 
    tag >>>= 6; 
    result[1] = base64chars[tag & 63]; 
    tag >>>= 6; 
    result[0] = base64chars[tag & 63]; 
    return new String(result); 
} 

यह साथ संयोजन में सिस्टम की घड़ी का उपयोग करता है एक काउंटर प्रत्येक एमएस के बारे में दो गारंटीकृत अद्वितीय मूल्य प्रदान करने में सक्षम होने के लिए सक्षम है। आपको इस गति की आवश्यकता नहीं हो सकती है, इसलिए आप >>> 5 को बदलने के लिए स्वतंत्र महसूस कर सकते हैं जिसे मैंने आपकी आवश्यकताओं के अनुसार "समायोजित" के साथ चिह्नित किया है। यदि आप इसे 1 तक बढ़ाते हैं, तो आपकी दर दो के कारक और आपकी विशिष्टता समय-अवधि युगल से नीचे जाती है। तो, उदाहरण के लिए, यदि आप इसके बजाय >>> 8 डालते हैं, तो आप प्रत्येक 4 एमएस के बारे में 1 मान उत्पन्न कर सकते हैं और मान 3200 दिनों के लिए दोहराना नहीं चाहिए। बेशक, यह गारंटी है कि उपयोगकर्ता दोहराना नहीं होगा अगर उपयोगकर्ता सिस्टम घड़ी के साथ गड़बड़ कर देता है। लेकिन चूंकि ये मान अनुक्रमिक रूप से उत्पन्न नहीं होते हैं, फिर भी यह बहुत ही असंभव है कि आप एक ही संख्या को दो बार मार देंगे। यूआरएल जितना संभव हो उतना छोटा रखने के लिए कोड दशमलव संख्या के बजाय 6-वर्ण टेक्स्ट-स्ट्रिंग (बेस 64) उत्पन्न करता है।

उम्मीद है कि इससे मदद मिलती है।:)

0

मुझे लगता है एक त्रुटि कोड फेंकने के लिए कोई जरूरत नहीं है, बावजूद आप जैसे

आप स्तर XX की तरह यह पेज या कुछ और हास्यास्पद तक पहुँचने के लिए रहना होगा एक संदेश प्रदर्शित आओ वापस जब आप

कोड 200-ओके के साथ स्वयं, इसलिए कोई कैश समस्या नहीं होगी और उद्देश्य भी हासिल किया जाएगा।

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

  • कोई संबंधित समस्या नहीं^_^