문제

Dojo Cometd 채널을 사용하여 임의의 Xmlencoded Java 객체를 앞뒤로 밀고 싶고 페이로드를 올바르게 디코딩하는 데 문제가 있습니다.

이렇게하려면 채팅실 클라이언트 데모 프로그램의 제거 버전 에이 보내기 메소드가 있습니다.

private void send(String string) {
  Map<String, Object> map = new HashMap<String, Object>();
  map.put("intArray", new int[] {1});

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  XMLEncoder xmlEncoder = new XMLEncoder(baos);
  xmlEncoder.writeObject(map);
  xmlEncoder.close();
  Map<String, Object> encodedMap = new HashMap<String, Object>();
  try {
    String encoded = baos.toString("UTF-8");
    encodedMap.put("xmlpayload", encoded);
  } catch (Exception e) {
   throw new RuntimeException("could not use UTF-8", e);
  } 
  bayreuxClient.publish("/prototype/a", encodedMap, String.valueOf(System.currentTimeMillis()));
}

지금은 UTF-8 인코딩 바이트 스트림에 평평한 XML 스 니펫을 생성합니다 (인코딩도 관리해야한다는 것을 알고 있지만 지금은 문제가되지 않습니다).

이것을 받아들이는 메시지 청취자는 다음과 같습니다.

listener = new MessageListener() {
  @Override
  public void deliver(Client fromClient, Client toClient, Message msg) {
    if (!_connected) {
      _connected = true;
      synchronized (this) {
      this.notify();
    }
  }
  Object data = msg.getData();
  if (data instanceof Map) {
    Map map = (Map) data;
    Object rawPayload = map.get("xmlpayload");
    if (rawPayload instanceof String) {
      System.out.println("xmlpayload = " + rawPayload);
      ByteArrayInputStream bais;
      try {
        String xmlPayload = ((String) rawPayload).replaceAll("&gt;",">").replaceAll("&lt;", "<").replaceAll("&amp;","&");
        bais = new ByteArrayInputStream(xmlPayload.getBytes("UTF-8"));
        XMLDecoder xmlDecoder = new XMLDecoder(bais);
        Object o = xmlDecoder.readObject();
        xmlDecoder.close();
        System.out.println(">> decoded payload=" + o + ", class=" + o.getClass());
      } catch (UnsupportedEncodingException e) {
        throw new RuntimeException("no UTF-8", e);
      }
     }
   }
  }
 };
 address = new Address("localhost", 8080);
 bayreuxClient = new BayeuxClient(httpClient, address, "/cometd/cometd");
 bayreuxClient.addListener(listener);

보시다시피, 나는 시행 착오로 보내진 문자열이 보낸 문자열이 더 크고, 앰퍼 샌드 캐릭터가 보호되어 보호되지 않고 xmldecode를 호출한다는 것을 발견했습니다.

출력은 다음과 같습니다.

xmlpayload = &lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;java version="1.6.0_16" class="java.beans.XMLDecoder"&gt; 
 &lt;object class="java.util.HashMap"&gt; 
  &lt;void method="put"&gt; 
   &lt;string&gt;intArray&lt;/string&gt; 
   &lt;array class="int" length="1"&gt; 
    &lt;void index="0"&gt; 
     &lt;int&gt;1&lt;/int&gt; 
    &lt;/void&gt; 
   &lt;/array&gt; 
  &lt;/void&gt; 
 &lt;/object&gt; 
&lt;/java&gt; 

>> decoded payload={intArray=[I@2f1e75}, class=class java.util.HashMap

가역적입니다. xmlencoded/xmldecoded 인 문자열 객체 에이 문자를 넣는 실험은 좋지 않았습니다. 두 배로 고려되지 않았습니다. 따라서 내 무차별 디코딩도 영향을 미쳤습니다.

문제는 다음과 같습니다 적절한 이 문자열을 해독하는 방법? 빠르고 더러운 코드 대신 사용해야 할 JSON 라이브러리가 있습니까? Cometd의 Java Client Library에서 오류에 도달했을 수 있습니까?

(참고 :이 실험에 COCETD-1.0.0RC0 라이브러리를 사용하고 있습니다).


편집 : 통신이 같은 웹 서버의 다른 배치를 통해 통신이 발생한 것으로 나타났습니다. 생각 Cometd 커뮤니케이션을 처리했습니다 저것 배포에는 XML 보호를 수행 한 필터가 포함되어 있습니다.

http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3

다시 말해 내 코드 외부의 구성 문제. 수정 된 배치 가이 문제를 해결하기를 바랍니다.

도움이 되었습니까?

해결책

Escape XML에 사용할 수있는 최고의 라이브러리는 Apache Commons Lang입니다.

   StringEscapeUtils.unescapeXml();

이것이 사용하는 Bayeux Java 클라이언트의 버그 인 것 같습니다. 인코딩/디코딩은 대칭이 아닙니다. 나는 그것을 사용하려고했다. 이제 나는 두 번 생각할 것이다 :)

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