解决openfire中发送某些特殊字符会断开xmpp连接的问题

在openfire中,如果发送某些特殊的字符(例如一些表情符合),会断开xmpp的连接,经查,是由以下的代码问题引起的:

src\java\org\jivesoftware\openfire\net\MXParser.java


    protected char more() throws IOException, XmlPullParserException {
    	final char codePoint  = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character!
		if ((codePoint == 0x0) ||  // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed.
				(codePoint == 0x9) ||          				     
				(codePoint == 0xA) ||
				(codePoint == 0xD) ||
				((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
				((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
				((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) {
			return codePoint;
		}
		
		throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));
    }

由于在这里把特殊的字符当成了一个异常,所以openfire会断开连接。


解决方法:

把代码修改为如下:

    @Override
    protected char more() throws IOException, XmlPullParserException {
    	final char codePoint  = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character!
		if ((codePoint == 0x0) ||  // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed.
				(codePoint == 0x9) ||          				     
				(codePoint == 0xA) ||
				(codePoint == 0xD) ||		
				//fix some emotion
				((codePoint >= 0x20) && (codePoint <= 0xFFFD)) ||				
				((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) {
			return codePoint;
		}
		
		throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16));
    }




[文章作者]曾健生

[作者邮箱]h6k65@126.com

[作者QQ]190678908

[新浪微博] @newjueqi

[博客]http://blog.csdn.net/newjueqi

          http://blog.sina.com.cn/h6k65


解决openfire中发送某些特殊字符会断开xmpp连接的问题

上一篇:架构设计之分布式缓存


下一篇:如何去除List集合中重复的元素