سؤال

وأنا بناء التطبيق الفيسبوك منصة الويب باستخدام GWT واستضافة على محرك التطبيقات.

وأنا وأضاف رمز التحقق من الصحة التي تستخدم تزويد معلمات سلسلة الاستعلام في رابط الاستدعاء. GWT يتيح لي الحصول على هذه المعايير من خلال الدعوة Window.Location.getParameterMap () وخارطة عاد هو غير قابل للتغيير.

وقد أكون مخطئا لكن اعتقد ان هذه المشكلة لا علاقة لها FB، GWT أو محرك التطبيقات خصيصا شيء وهي أكثر وصولا الى بلدي سوء فهم شيء حول الكائنات الخريطة.

وأنا لا أعتقد أن قانون بلدي محاولات لتعديل خريطة زودت لكن الخطأ أحصل على ما يبدو تشير إلى أن قانون بلدي هو محاولة لتعديل خريطة ثابتة.

ويمكن للشخص الرجاء إلقاء نظرة واسمحوا لي أن أعرف أين أنا تعديل على خريطة unmodifiable؟

وأود أن توفير تتبع المكدس ولكن لا أستطيع أن أجد وسيلة للحصول على تتبع مكدس لهذا لعرضه في سجلات محرك التطبيقات.

وشكرا مقدما على أي وكل مساعدة: -)

/**
 * Validation Test
 * To generate the signature for these arguments:
 * 1. Remove the fb_sig key and value pair.
 * 2. Remove the "fb_sig_" prefix from all of the keys.
 * 3. Sort the array alphabetically by key.
 * 4. Concatenate all key/value pairs together in the format "k=v".
 * 5. Append your secret key.
 * 6. Take the md5 hash of the whole string.
 * @param fbQueryStringParams
 * @return String
 */
public String test(Map<String,List<java.lang.String>> fbQueryStringParams) {

    String appSecret = TinyFBClient.APP_SECRET;
    String fbSig = fbQueryStringParams.get("fb_sig").get(0);
    StringBuilder sb = new StringBuilder();     
    TreeMap<String,String> sortedMap = new TreeMap<String,String>();

    // Get a Set view of the Map of query string parameters.
    Set<Map.Entry<String,List<java.lang.String>>> mapEntries = fbQueryStringParams.entrySet();

    // Iterate through the Set view, inserting into a SortedMap all Map.Entry's
    // that do not have a Key value of "fb_sig".
    Iterator<Map.Entry<String,List<java.lang.String>>> i = mapEntries.iterator();
    while(i.hasNext()) {

        Map.Entry<String,List<java.lang.String>> mapEntry = i.next();

        if(!mapEntry.getKey().equals("fb_sig")) { // 1. Remove the fb_sig key and value pair.

            sortedMap.put(mapEntry.getKey(),mapEntry.getValue().get(0)); // 3. Sort the array alphabetically by key.

        }

    }

    // Get a Set view of the Map of alphabetically sorted Map.Entry objects.
    Set<Map.Entry<String,String>> sortedMapEntries = sortedMap.entrySet();

    // Iterate through the Set view, appending the concatenated key's and value's
    // to a StringBuilder object.
    Iterator<Map.Entry<String,String>> ii = sortedMapEntries.iterator();
    while(ii.hasNext()) {

        Map.Entry<String,String> mapEntry = ii.next();

        // 4. Concatenate all key/value pairs together in the format "k=v".
        sb.append(mapEntry.getKey().replaceAll("fb_sig_","")); // 2. Remove the "fb_sig_" prefix from all of the keys.
        sb.append("=");
        sb.append(mapEntry.getValue());

    }

    sb.append(appSecret); // 5. Append your secret key.

    String md5 = DigestUtils.md5Hex(sb.toString()); // 6. Take the md5 hash of the whole string.

    // Build and return an output String for display.
    StringBuilder output = new StringBuilder();
    output.append("fbSig = "+fbSig);
    output.append("<br/>");
    output.append("md5 = "+md5);
    return output.toString();

}
هل كانت مفيدة؟

المحلول

ونسخ Windows.Location.getParameterMap () في HashMap وأنها ستعمل:

وهكذا ترسل HashMap جديد> (Windows.Location.getParameterMap ()) على RPC يعمل.

والمشكلة هي أن unmodifiableMap ليس تسلسل لGWT. وأنا أعلم أن لديه علامة قابل للتسلسل، ولكن في GWT يعمل مختلفة قليلا. معظم الطبقات جمع لها تنفيذ GWT العرف وبعضها غير متوافق بنسبة 100٪.

نصائح أخرى

وأنا لا أرى أي مجموعات unmodifiable.

والتعليمات البرمجية معقد جدا. إذا كنت قد فهمت ذلك الحق، ثم وهذا ينبغي أن يكون معادلا. وأود أن لا تستخدم أدوات Map.Entry وTreeMap لديه منشئ مفيد لاحتياجاتك. وأخيرا، كنت تفضل "فورال" حلقة على مدى مكرر.

public String test(Map<String, List<java.lang.String>> fbQueryStringParams) {
    String appSecret = TinyFBClient.APP_SECRET;
    String fbSig = fbQueryStringParams.get("fb_sig").get(0);
    StringBuilder sb = new StringBuilder();
    TreeMap<String, List<String>> sortedMap = new TreeMap<String, List<String>>(fbQueryStringParams);
    sortedMap.remove("fbSig"); // remove the unwanted entry

    for (String key, sortedMap.keySet()) {
        List<String> values = sortedMap.get(key);
        String printableKey = key.replaceAll("fb_sig_", ""));
        String value = "EMPTY LIST";

        if (!values.isEmpty()) {
            // This could have been your problem, you always
            // assume, all lists in the map are not empty
            value = values.get(0);
        }

        sb.append(String.format("%s=%s", printableKey, value);
    }

    sb.append(appSecret);
    String md5 = DigestUtils.md5Hex(sb.toString());

    // Build and return an output String for display.
    StringBuilder output = new StringBuilder();
    output.append("fbSig = " + fbSig);
    output.append("<br/>");
    output.append("md5 = " + md5);
    return output.toString();
}

وحين إعادة بيع ديون وجدت واحدة خلل محتمل: عند إنشاء خريطة مرتبة في التعليمات البرمجية، التي تفترض، كافة القوائم في الخريطة ليست فارغة. حتى أول قائمة فارغة سوف يؤدي إلى NPE في الحلقة الأولى.

والقيام System.out.println (fbQueryStringParams.getClass ())؛ في بداية الرسالة (أو تسجيل أو أيا كان عليك أن تكون قادرا على رؤية ما هو عليه).

إذا تم تمرير هذه الحجة لك من النظام ومن المرجح جدا ملفوفة على أنها مجموعة unmodifiable لأنها لا أريد منك تغيير ذلك.

هل أفهم بشكل صحيح أن تقومون به Window.Location.getParameterMap في رمز العميل الخاص بك، وإرساله إلى الخادم في مكالمة RPC؟ في هذه الحالة ... والسؤال هو: هل أن ParameterMap للتسلسل؟ ليس كل التطبيقات هي في الواقع معتمدة في GWT. لذلك قد يكون مجرد رمز من خادم لا يسمى حتى ولكنها تحطم قبل أن تتمكن من إرسال الطلب. هل رأيت أي إنذار خلال تجميع GWT؟

والرمز، على الرغم من أن التنفيذ يمكن تنظيف وفي الواقع يمكن أن يكون هناك NPE، لا يتم تعديل خريطة المعلمة الموردة أو القائمة في القيم خريطة. هذا يعني أن المشكلة ربما في مكان آخر.

لماذا لا تقوم بتشغيل التطبيق الخاص بك في وضع استضافت (أو نمط التنمية كما يسمونها في GWT 2.0)؟

وديفيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top