문제

GWT를 사용하여 Facebook 플랫폼 웹 앱을 구축하여 App Engine에서 호스팅하고 있습니다.

콜백 URL에서 제공된 쿼리 문자열 매개 변수를 사용하는 유효성 검사 코드를 추가하고 있습니다. GWT를 사용하면 Window.location.getParameterMap ()을 호출 하여이 매개 변수를 얻을 수 있으며 리턴 된 맵은 불변입니다.

이 문제는 FB, GWT 또는 App 엔진과 구체적으로 관련이 없으며 MAP 객체에 대한 오해에 더 적합하다고 생각합니다.

내 코드가 제공된 맵을 수정하려고 시도한다고 생각하지 않지만 오류는 내 코드가 불변의 맵을 수정하려고한다고 제안하는 것 같습니다.

누군가를 살펴보고 수정할 수없는지도를 수정하는 곳을 알려주시겠습니까?

스택 추적을 공급하지만 앱 엔진 로그에 표시 할 스택 추적을 얻는 방법을 찾을 수 없습니다.

모든 도움에 미리 감사드립니다 :-)

/**
 * 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 ()을 해시 맵에 복사하면 작동합니다.

따라서 작동하는 RPC를 통해 새로운 Hashmap> (Windows.Location.getParameterMap ())을 보내십시오.

문제는 Unmodifiablemap이 GWT에 대한 직렬화 할 수 없다는 것입니다. 나는 그것이 직렬화 가능한 마커가 있다는 것을 알고 있지만 GWT에서는 약간 다르게 작동합니다. 대부분의 컬렉션 클래스에는 사용자 정의 GWT 구현이 있으며 일부는 100% 호환되지 않습니다.

다른 팁

수정할 수없는 컬렉션이 보이지 않습니다.

코드는 매우 복잡합니다. 내가 그것을 올바르게 이해한다면, 이것은 동일해야합니다. 나는 map.entry 객체를 사용하지 않을 것이며 Treemap에는 당신의 요구에 대한 편리한 생성자가 있습니다. 그리고 마지막으로, 나는 반복자보다 'forall'루프를 선호합니다.

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();
}

Refactoror는 하나의 가능한 버그를 찾았습니다. 코드에서 정렬 된 맵을 만들 때 맵의 모든 목록이 비어 있지 않다고 가정합니다. 따라서 첫 번째 빈 목록은 첫 번째 루프에서 NPE를 유발합니다.

system.out.println (fbquerystringparams.getClass ()); 메시지가 시작될 때 (또는 로그인하거나 그것이 무엇인지 볼 수 있어야하는지).

그 주장이 시스템에서 당신에게 전달되면 그것은 당신이 그것을 변경하기를 원하지 않기 때문에 수정할 수없는 컬렉션으로 싸여있을 가능성이 높습니다.

클라이언트 코드에서 Window.location.getParameterMap을 수행하고 RPC 호출로 서버로 전송하고 있음을 올바르게 이해 했습니까? 이 경우 ... 질문은 다음과 같습니다. 그 매개 변수 직렬화가 가능합니까? 모든 구현이 실제로 GWT에서 지원되는 것은 아닙니다. 따라서 서버 코드가 호출되지 않았지만 요청을 보내기 전에 충돌 할 수 있습니다. GWT 컴파일 중에 경고를 보셨습니까?

코드는 구현을 정리할 수 있지만 실제로 NPE를 가질 수 있지만 맵 값의 제공된 매개 변수 맵 또는 목록을 수정하지는 않습니다. 따라서 문제는 아마도 다른 곳일 것입니다.

호스팅 모드 (또는 GWT 2.0에서 부르는 개발 모드)로 애플리케이션을 실행하지 않는 이유는 무엇입니까?

데이비드

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top